Qt部件&窗口设置
一、按键属性
(一)Qt::WA_TransparentForMouseEvents
实现鼠标穿透功能,类似“隔空取物、隔山打牛”的效果。
//qwidget.h void setAttribute(Qt::WidgetAttribute, bool on = true);
启用后,此属性将禁止向小组件及其子件传递鼠标事件。鼠标事件被传递给其他小组件,就像小组件及其子代不存在于小组件层次结构中一样;鼠标点击和其他事件有效地 "穿过 "它们。这个属性在默认情况下是禁用的。
1.用法
theButton->setAttribute(Qt::WA_TransparentForMouseEvents, true);
当前窗口透明区域不响应鼠标事件:
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground, true);
如果当前窗口不透明,但又需要实现鼠标穿透,要注意代码先后顺序:
// 一定要先设置鼠标穿透,否则无法穿透 setAttribute(Qt::WA_TransparentForMouseEvents, true); setWindowFlag(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground, true);
其他应用场景举例:
1、禁止响应鼠标的点击事件,但是需要响应代码层面的信号
2、如果有需要,相比较于设置控件的可用性,设置属性的做法更为隐蔽
3、有些透明窗体(或者异形界面)允许鼠标可以在本窗口界面操作背后的窗口
2.例子
//按钮上显示的文字 QLabel * label = new QLabel; label->setParent(this); label->setFixedSize(menuBtn->width(),menuBtn->height()); label->setText(QString::number(i+1)); label->move(25 + (i%4)*70 , 130+ (i/4)*70); //设置label上的文字对齐方式 水平居中 和垂直居中 label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //鼠标事件穿透 label->setAttribute(Qt::WA_TransparentForMouseEvents,true);
二、窗口属性
(一)Qt::WA_DeleteOnClose
1.介绍
当用户关闭一个主窗口时,默认行为是隐藏它,所以它还会保留在内存中。对于数量大的主窗口会造成一定的问题。
解决办法是在构造函数中对Qt::WA_DeleteOnClose的属性进行设置:
setAttribute(Qt::WA_DeleteOnClose);
所以如果我们在程序中通过 new 的方式创建一个窗口,可以给该窗口设置 Qt::WA_DeleteOnClose属性。这样在关闭这个窗口时Qt能够自动回收该窗口所占用的资源,这样能够及时回收无效的资源,有用利于节约内存空间。
2.关于Qt::WA_DeleteOnClose 造成的野指针问题
当设置setAttribute(QT::WA_DeleteOnClose,true)时,才会触发destory信号,可以手动将其置为nullptr
if(dialog==null) { dialog=new Dialog()
//注意,如果使用了setAttribute(QT::WA_DeleteOnClose,true);则不能再将其加入到对象树,即不能通过父类this去创建,否则会调用析构函数释放该资源,
//而setAttribute(QT::WA_DeleteOnClose,true);后,窗口在销毁时也会释放自身资源,导致异常! dialog->setAttribute(QT::WA_DeleteOnClose,true); connect(dialog, &Dialog::destroyed, this, [=](){ dialog= nullptr; }); } dialog.show(),
(二)setMouseTracking函数
1.介绍
首先介绍一个变量bool mouseTracking
,这个变量保存值表示窗口部件跟踪鼠标是否生效。可以通过函数setMouseTracking()
来设置其值,可以通过函数hasMouseTracking()
来获得其值。
setMouseTracking(true)
:鼠标跟踪生效,即使鼠标按键没有被按下,窗口部件也会接收鼠标移动事件。鼠标只要移动就会触发mouseMoveEvent(QMouseEvent *event)
。
setMouseTracking(false)
:鼠标跟踪失效,必须在鼠标按键被按下时,窗口部件也会接收鼠标移动事件,才会触发mouseMoveEvent(QMouseEvent *event)
。
2.使用样例
// 初始配置 setWindowFlags(Qt::WindowCloseButtonHint);//Qt.WindowCloseButtonHint 窗口只有一个关闭按钮 setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT); setMouseTracking(true);//这里 setWindowTitle(QString("欧陆战争")); setWindowIcon(QPixmap(MAIN_SCENE_ICON_PATH));
(三)w->setFixedSize(w->width(),w->height());
w->show()前面调用w->setFixedSize(w->width(),w->height())和在w->show()后面调用的区别
- 如果在w->show()前面调用w->setFixedSize(w->width(),w->height()),那么此时获取的w->width()和w->height()是默认值。
- 但是如果在w->show()后面面调用w->setFixedSize(w->width(),w->height())此时获取的w->width()和w->height()是widget根据子控件大小自动调整出来的合适的值。
1.
w->setFixedSize(w->width(),w->height());
w->show();
现象如下图:
2.
w->show();
w->setFixedSize(w->width(),w->height());
现象如下图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了