qt qwidget样式、控件使用等问题随笔记

这篇博客总结了在Qt开发中遇到的各种问题及解决方案,包括:QWidget样式设置问题,边框设置不生效,界面闪烁,QSS样式不生效,Qt树形控件信号问题,QLineEdit自定义类提升,界面构造函数中获取控件大小,paintEvent不触发,以及使用eventFilter实现界面隐藏和显示等常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题:自定义的类设置父类,都是继承于QWidget, 在样式表qss中设置background,即使设置了类名,有时还会默认显示继承的父类背景色。
解决方案:在构造函数中设置setAutoFillBackground(true);或者在ui中勾选autoFillBackground选项。

2.问题: QWidget进行边框设置不生效问题。
解决方法:把ui界面QWidget上加添加一层QFrame,然后在frame里进行控件添加和布局,最后在qss里对frame进行边框样式设置;或者,重写paintEvent(QPaintEvent *event)函数。
void paintEvent(QPaintEvent *event)
{
QStylePainter painter(this);
QStyleOption opt;
opt.initFrom(this);
opt.rect = rect();
QPainter p(this);
painter.drawPrimitive(QStyle::PE_Widget,opt);//绘制样式
QWidget::paintEvent(event);
}

3.qt widget界面会一闪而逝,然后显示出来的现象。
解决方法:先设置数据、布局等内容填充,再show界面显示。

  1. 关于qss文件样式不生效的问题。
    qss样式不生效有很多原因导致,大多情况手动刷新下,style()->polish()即可;对于qss样式一般我们会用类名进行控件约束,防止样式错乱;其实上述的刷新,实际上是通过paintEvent进行绘制实现,而paintEvent是QWidget的方法,那么,问题来了,当我们继承于QObject,或者一些代理类等,此时,再用类名约束就会导致样式不生效,真是深海巨坑,一直在排查写的样式问题
    解决方法:使用全局设置样式,如.QPushButton#btn{};

5.关于Qt 树形控件的bug记录,版本5.14.2。
使用QTreeWidget或者QtreeView等带有item指针的信号时,比如点击事件的信号,如果选中的item变成未选中状态(使之失去焦点),qt内部会销毁临时指针(未深究),再去使用这个指针去获取item中的数据,无法获取。若涉及到其他指针的使用就会导致程序崩溃。
解决方法:若有会导致失去焦点的操作时,不要把槽函数的item作为成员变量使用。也可在失去焦点后可通过遍历树控件再找到原点击的item重新赋值即可。

6.关于QLineEdit控件自定义类提升问题
对于一个输入框无法满足特定需求时,一般会采用纯自绘控件(较为麻烦)、以及提升为自定义类的方式。但是自定义提升时,对于vs编译器会遇到ui_xxx.h 和 moc_xxx.cpp编译失败问题,此问题大多数情况可以通过uic命令、moc命令重新生成来解决(uic xxx.ui -o ui_xxx.h moc xxx.h -o moc_xxx.cpp)。而当你使用过qlineedit之后(ui属性里进行某些设置),qt内部就会新增原控件相应的方法,此时再去提升控件,无论怎么编译和修改都无法去掉已生成的方法,解决方法就是把相应的控件删除掉,再重新添加一个控件提升,即可。总结,使用过的东西,即使你再怎么还原怎么恢复,都不在是当初那个了/(ㄒoㄒ)/~~

7.关于Qt界面构造函数里无法获取控件大小的问题
在UI的构造函数里,qt会按照默认的界面大小进行初始构造,我们使用width(),height(),geometry()等方法无法获取到界面里子控件的真实大小,除非你创建控件时已经设置了大小。那么最佳的解决方式就是重写showEvent()方法,然后再去获取控件的大小就跟show出来后的大小一致了。

8.关于paintEvent

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值