QT弹窗去掉边框冻结的问题

最近需要在原有界面上做几个弹窗显示。
继承了QWidget的弹窗,和继承了QDialog的弹窗,显示后,去掉边框都会冻结,界面无法操作。
setWindowFlags(Qt::FramelessWindowHint | windowFlags() | Qt::WindowStaysOnTopHint);
也有网友说是需要或上Qt::Dialog或者Qt::Widget的,统统都没有用。
后来继承了QFrame,然后就可以了。最终原因,也没整明白。QFrame也是继承的QWidget呀。

另外还有一个奇怪的问题:软件有个开机界面时QDialog的,在初始化界面内容后,发射一个关闭信号,通知开机界面accept,然后显示主界面。但是,这种发射信号使QDialog关闭,会导致弹窗冻结(当起了其他QDialog之后,弹窗解冻)。可是,如果是初始化界面之后,直接调用QDialog::accept(),启动主界面之后,弹窗不会被冻结。这个原因也没有找到。

### 如何在Qt中创建弹窗 #### 使用 `QMessageBox` 类创建基本消息弹窗 为了在 Qt 应用程序中显示一个简单的消息弹窗,可以使用 `QMessageBox` 类。这提供了多种类型的对话框用于不同场景的信息提示。 ```cpp #include <QApplication> #include <QPushButton> #include <QWidget> #include <QMessageBox> class MainWindow : public QWidget { protected: void mousePressEvent(QMouseEvent *event) override { QMessageBox::information(this, tr("App"), tr("This is a message box")); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton button(tr("&Show Message Box")); QObject::connect(&button, &QPushButton::clicked, [&]() { QMessageBox::about(&button, tr("About"), tr("The <b>Message Box</b> widget " "is used to display a message to the user.")); }); button.show(); return app.exec(); } ``` 此代码片段展示了如何设置当按钮被按下时触发的消息弹窗[^2]。 #### 实现带有两个按钮的选择型弹窗 对于更复杂的需求,比如需要用户做出选择的情况,可以通过自定义信号槽机制来处理来自子窗口的操作反馈: ```cpp // 主窗口头文件声明部分增加如下成员变量和方法: private slots: void onCustomDialogFinished(bool result); // 构造函数内连接信号与槽: connect(customDialog.get(), SIGNAL(finished(bool)), this,SLOT(onCustomDialogFinished(bool))); // 定义槽函数逻辑: void MainWindow::onCustomDialogFinished(bool result){ if(result){ /* 执行通道打开后的操作 */ }else{ /* 处理取消或其他情况 */} } // 自定义对话框类实现两按钮布局并发送完成信号: emit finished(buttonClicked == openButton); // 假设openButton代表确认选项 ``` 上述例子说明了怎样构建具有 “通道打开” 和 “通道关闭” 功能的交互式弹窗,并让其返回结果给调用者以便进一步处理[^4]。 #### 非主线程中的弹窗应用案例 如果希望在非 GUI 线程里也能方便地发起界面级别的通知,则需注意跨线程通信的安全性和效率问题。下面的例子给出了一个解决方案框架: ```cpp class MinWindow : public QMainWindow { public: explicit MinWindow(QWidget* parent = nullptr): QMainWindow(parent), label(new QLabel(this)){} signals: void showBox(); private slots: void handleShowBox(){ QMessageBox::information(nullptr,"Info","Time shown"); } private: QThread worker; WorkerObject* workerObj; // Assume defined elsewhere. QLabel* label; }; // 初始化worker对象并与之关联工作线程... minWin->moveToThread(&worker); QObject::connect(minWin,&MinWindow::showBox,minWin,&MinWindow::handleShowBox); worker.start(); ``` 这里的关键在于通过信号-槽机制间接触发展示行为,从而避免直接在线程间传递 UI 控件指针带来的风险[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值