一、按键属性
(一)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、有些透明窗体(或者异形界面)允许鼠标可以在本窗口界面操作背后的窗口
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
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(),
(二)Qt部件&窗口设置
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());
现象如下图:
文章转自博客园(ImreW):Qt部件&窗口设置 - ImreW - 博客园
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓