Qt 中将 QWidget 改为模态的方法

方法1:使用 setWindowModality()

复制代码
// 设置为应用程序模态(阻止与所有窗口交互)
widget->setWindowModality(Qt::ApplicationModal);

// 设置为窗口模态(只阻止与父窗口交互)
widget->setWindowModality(Qt::WindowModal);

// 设置为非模态
widget->setWindowModality(Qt::NonModal);

// 示例
QWidget* modalWidget = new QWidget();
modalWidget->setWindowModality(Qt::ApplicationModal);
modalWidget->show();

方法2:使用 exec() 方法(像 QDialog 一样)

复制代码
// 自定义 QWidget 子类,添加 exec() 方法
class ModalWidget : public QWidget {
    Q_OBJECT
public:
    ModalWidget(QWidget* parent = nullptr) : QWidget(parent) {
        setWindowFlags(Qt::Dialog);
        setWindowModality(Qt::ApplicationModal);
    }
    
    int exec() {
        show();
        m_eventLoop.exec();
        return m_result;
    }
    
public slots:
    void accept() {
        m_result = QDialog::Accepted;
        close();
    }
    
    void reject() {
        m_result = QDialog::Rejected;
        close();
    }
    
protected:
    void closeEvent(QCloseEvent* event) override {
        m_eventLoop.quit();
        QWidget::closeEvent(event);
    }
    
private:
    QEventLoop m_eventLoop;
    int m_result = QDialog::Rejected;
};

// 使用
ModalWidget* widget = new ModalWidget();
if (widget->exec() == QDialog::Accepted) {
    qDebug() << "用户接受了";
}

**方法3:使用setWindowModality+**QEventLoop

复制代码
    FormVideoSnap *widget = new FormVideoSnap(nullptr);
    widget->setWindowModality(Qt::ApplicationModal);
    widget->setAttribute(Qt::WA_DeleteOnClose);

    QEventLoop loop;
    // 连接自定义aboutToClose 信号
    QObject::connect(widget, &FormVideoSnap::aboutToClose, [this](const QString& filePath) {
        m_lastSnapshotFilePath = filePath;
    });
    QObject::connect(widget, &FormVideoSnap::destroyed, &loop, &QEventLoop::quit);
    widget->show();
    loop.exec(); // 阻塞直到窗口关闭
相关推荐
mengzhi啊12 小时前
Qt Designer UI 界面 拖的两个 QLineEdit,想按 Tab 从第一个跳到第二个
qt
笨笨马甲15 小时前
Qt MQTT
开发语言·qt
姓刘的哦18 小时前
Qt实现蚂蚁线
开发语言·qt
Ivy_belief18 小时前
Qt网络编程实战:从零掌握 QUdpSocket 及 UDP 通信
网络·qt·udp
丁劲犇19 小时前
在Trae Solo模式下用Qt HttpServer和Concurrent升级MCP服务器绘制6G互联网覆盖区域
服务器·开发语言·qt·ai·6g·mcp·trae
笨笨马甲19 小时前
Qt MODBUS协议
开发语言·qt
我喜欢就喜欢19 小时前
Word 模板匹配与样式同步技术详解
开发语言·c++·qt·word·模板匹配
Ronin30521 小时前
【Qt常用控件】容器类控件和布局管理器
开发语言·qt·常用控件·布局管理器·容器类控件
2301_803554521 天前
qt信号槽机制以及底层实现原理
开发语言·qt
笨笨马甲1 天前
Qt 音视频编解码
开发语言·qt