一、Qt Widgets 问题交流
1.QWidget鼠标事件穿透
对于一些透明或者半透明的QWidget,可能需要点击其下方的按钮或其他组件,但是QWidget本身是会接收这些鼠标事件的,需要一些额外的处理。下面是百度到的一些方法:
方式A.设置setAttribute(Qt::WA_TransparentForMouseEvents, true),设置之后该QWidget对象树就不再处理鼠标事件。最大的缺点就是不仅该QWidget不响应鼠标事件,它上面的其他组件也没法响应鼠标事件了。
方式B.setMask把底部要点击的地方抠出来,缺点是抠出来的地方就成了全透明,不适合半透明的需求:
QRegion reg(ui->widget->rect());
//bottom为被widget挡住的按钮
auto btn_area=ui->btnBottom->geometry();
btn_area.moveTo(btn_area.topLeft()-ui->widget->geometry().topLeft());
reg-=QRegion(btn_area);
ui->widget->setMask(reg);
方法C. QWdidget鼠标事件处理先判断坐标点下方是否有其他组件,有则传递下去:
void mouseMoveEvent(QMouseEvent *event){
transMouseEvents(event);
}
void mousePressEvent(QMouseEvent *event){
transMouseEvents(event);
}
void mouseReleaseEvent(QMouseEvent *event){
transMouseEvents(event);
}
void mouseDoubleClickEvent(QMouseEvent *event){
transMouseEvents(event);
}
void transMouseEvents(QMouseEvent *event){
if (this->parentWidget()) {
this->setAttribute(Qt::WA_TransparentForMouseEvents, true);
QPoint pt = this->mapTo(this->parentWidget(), event->pos());
QWidget *wid = this->parentWidget()->childAt(pt);
if (wid) {
pt = wid->mapFrom(this->parentWidget(), pt);
QMouseEvent *mEvent = new QMouseEvent(event->type(), pt, event->button(), event->buttons(), event->modifiers());
QApplication::postEvent(wid, mEvent);
}
this->setAttribute(Qt::WA_TransparentForMouseEvents, false);
}
}
参考:QT 鼠标穿透 - 知乎
二、Qt Quick 问题交流 1.打包命令问题百度搜(QML打包),找到的结果一般都是这样的:
windeployqt 程序.exe --qmldir C:\Qt\Qt5.15.2\5.15.2\msvc2019_64\qml
这些博文上,--qmldir的参数一般都是指向Qt安装目录,但是通过查看文档可知,qmldir应该指向项目源码的qml目录,以查找导入了哪些模块,qmlimport才是用来指向安装路径或者其他依赖模块路径的。
文档:https://doc.qt.io/qt-5/windows-deployment.html
三、其他 1.QAXObject在WPS环境下读取Excel的UsedRange.Value为空一开始测试MS Office时如下的代码可以正常的读取到UsedRange的表格内容:
QAxObject *used_range = work_sheet->querySubObject("UsedRange");
auto range_data = used_range->property("Value").toList();
但是在测试WPS时,读取到的值是空的,修改为dynamicCall后就能正常读取了:
QAxObject *used_range = work_sheet->querySubObject("UsedRange");
auto range_data = used_range->dynamicCall("Value()").toList();
完整的测试代码如下:
void parseExcel()
{
const QString filepath = QFileDialog::getOpenFileName(this);
if(filepath.isEmpty()){
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?