一、Qt Widgets 问题交流
1.对话框exec嵌套时的显示问题
在槽函数中exec二级窗口,hide二级窗口后再exec三级窗口,三级窗口关闭时重新show二级窗口并没有显示出来,但是画面被模态阻塞了无法操作,且二级exec莫名直接退出了。
测试环境:Win11 + MSVC2022 + Qt5.15.2 / Qt6.11.0
测试代码:
cpp
void MainWindow::on_pushButton_clicked()
{
// 第一层槽函数
qDebug()<<"begin 1";
// Dialog是堆对象还是栈对象都是一样的现象
QDialog dlg1;
dlg1.setWindowTitle("dlg1");
dlg1.setLayout(new QVBoxLayout());
QPushButton *button = new QPushButton("Click");
dlg1.layout()->addWidget(button);
QObject::connect(button, &QPushButton::clicked, &dlg1,
[&]()
{
// 第二层槽函数
qDebug()<<"begin 2";
dlg1.hide();
QDialog dlg2;
dlg2.setWindowTitle("dlg2");
dlg2.exec();
// 此处show并没有显示出来,但是画面被模态阻塞了无法操作
// 且dlg1.exec异常结束
dlg1.show();
qDebug()<<"end 2";
});
dlg1.exec();
qDebug()<<"end 1";
}
先将QDialog栈对象改为new堆对象尝试,现象一致。然后测试QDialog.exec()拆解为QEventLoop.exec()+QDialog.open(),问题解决,其他伴生问题待测试
修改代码:
cpp
void MainWindow::on_pushButton_clicked()
{
qDebug()<<"begin 1";
QEventLoop loop1;
QDialog dlg1;
dlg1.setWindowTitle("dlg1");
dlg1.setLayout(new QVBoxLayout());
QPushButton *button = new QPushButton("Click");
dlg1.layout()->addWidget(button);
QObject::connect(&dlg1, &QDialog::finished, &loop1, &QEventLoop::quit);
QObject::connect(button, &QPushButton::clicked, &dlg1,
[&]()
{
qDebug()<<"begin 2";
dlg1.hide();
QDialog dlg2;
dlg2.setWindowTitle("dlg2");
dlg2.exec();
dlg1.show();
qDebug()<<"end 2";
});
dlg1.open();
loop1.exec();
qDebug()<<"end 1";
}
2.connectSlotsByName遇到同名对象可能错误连接
通过on_objectName_signal函数命名方式建立信号槽连接,如果有同objectName的对象,就可能遇到连接错乱,比如其中一个对象触发了所有槽函数,另一个未连接到任何槽函数。最好还是手动connect建立信号槽连接,想要保证所有objectName不同维护也比较麻烦。
测试环境:Win11 + MSVC2022 + Qt5.15.2 / Qt6.11.0
QT BUG:https://qt-project.atlassian.net/browse/QTBUG-49749