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、有些透明窗体(或者异形界面)允许鼠标可以在本窗口界面操作背后的窗口

本文福利,莬费领取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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值