Qt5.0以上的版本,Dialog页面样式不刷新(MainWindow同)

在Qt5.0及以上版本中,Dialog页面可能出现样式不刷新的问题,表现为界面显示无变化,即使使用update或resize方法。但当调用showMaximized()后,问题可得到解决。该问题被确认为Qt5.0的一个bug。解决方法是在Dialog的showEvent中设置页面属性为Qt::WA_Mapped。

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

如题,Dialog刚打开时会出现,鼠标点击会响应,功能能正常使用,但是界面显示完全没有变化,没有hover/pressed/checked等状态,update或者resize都不行,但是showMaximized()之后就没问题了。这是Qt5.0版本以上的一个bug。

解决:在showEvent里面设置页面属性为Qt::WA_Mapped


void ConfigTest::showEvent(QShowEvent *e)
{
#if QT_VERSION >= 0X050000
    this->setAttribute(Qt::WA_Mapped);
#endif
    QDialog::showEvent(e);
}


Qt 中,`connect` 函数用于建立信号(signal)与槽(slot)之间的连接,实现对象间通信。`connect` 的使用方式随着 Qt 版本的演进而有所变化,现代 Qt5.0 以上)支持多种语法风格,包括传统字符串语法和现代基于函数指针的语法。以下是 `connect` 函数的主要用法: ### 1. 传统信号与槽连接方式 这种语法使用 `SIGNAL()` 和 `SLOT()` 宏来指定信号和槽函数。 ```cpp connect(sender, SIGNAL(signalName()), receiver, SLOT(slotName())); ``` 例如,连接按钮的点击信号到主窗口的槽函数: ```cpp connect(button, SIGNAL(clicked()), this, SLOT(onbuttonClicked())); ``` 这种方式的优点是简洁,但缺点是编译器无法进行类型检查,容易因拼写错误或参数匹配导致连接失败 [^3]。 ### 2. 基于函数指针的新式连接方式 Qt 5 引入了更安全、更灵活的连接方式,利用 C++11 的特性,使用函数指针进行连接,编译器可以进行类型检查。 ```cpp connect(sender, &Sender::signalName, receiver, &Receiver::slotName); ``` 例如: ```cpp connect(button, &QPushButton::clicked, this, &MainWindow::onbuttonClicked); ``` 这种方式能够提供编译期的类型检查,避免运行时错误,并支持函数重载解析 [^3]。 ### 3. 使用 Lambda 表达式进行连接 Lambda 表达式允许在连接信号时直接编写处理逻辑,提高了代码的可读性和封装性。 ```cpp connect(button, &QPushButton::clicked, this, [this](){ qDebug() << "按钮被点击了!"; }); ``` 例如在构造函数中动态创建按钮并连接: ```cpp QPushButton* button = new QPushButton(this); button->setText("按钮"); connect(button, &QPushButton::clicked, this, [button](){ button->setText("我被按下了!"); }); ``` Lambda 表达式适用于简单的逻辑,也可以捕获上下文变量,使用 `[=]` 或 `[this]` 等方式进行捕获 [^4]。 ### 4. 带参数的信号与槽连接 当信号和槽函数需要传递参数时,需要确保参数类型匹配。 ```cpp connect(this, SIGNAL(sentNums(int)), start_dialog, SLOT(setGuessNums(int))); ``` 在发送信号时传递参数: ```cpp emit sentNums(g.getA()); ``` 接收方需定义对应的槽函数: ```cpp public slots: void setGuessNums(int a); ``` 这种方式常用于跨对象传递数据,如主窗口向子窗口传递信息 [^2]。 ### 5. 使用 `Qt::UniqueConnection` 避免重复连接 当希望确保某个信号与槽只连接一次时,可以使用 `Qt::UniqueConnection` 标志,防止重复调用 `connect` 导致多次连接。 ```cpp connect(sender, &Sender::signalName, receiver, &Receiver::slotName, Qt::UniqueConnection); ``` 该标志通常与按位或操作符 `|` 一起使用,配合其他连接类型,如 `Qt::QueuedConnection` 或 `Qt::DirectConnection` [^1]。 ### 6. 跨线程连接 在多线程环境中,可以使用 `Qt::QueuedConnection` 来确保信号在接收线程的事件循环中被处理。 ```cpp connect(worker, &Worker::resultReady, this, &MainWindow::handleResult, Qt::QueuedConnection); ``` 这在异步操作和后台任务处理中非常有用。 ### 7. 断开连接 如果需要取消信号与槽的连接,可以使用 `disconnect` 函数: ```cpp disconnect(sender, &Sender::signalName, receiver, &Receiver::slotName); ``` 这在对象销毁或状态切换时用于释放资源。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值