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(); // 阻塞直到窗口关闭
相关推荐
一只小bit17 小时前
Qt 事件:覆盖介绍、处理、各种类型及运用全详解
前端·c++·qt·cpp
不会c嘎嘎19 小时前
QT中的事件机制
开发语言·qt
涛起云永19 小时前
Qt 源码编译 -- obj文件无法找到
开发语言·qt
郝学胜-神的一滴20 小时前
Qt自定义TabWidget:实现左侧标签与水平文本布局
开发语言·c++·qt·程序人生
划水的code搬运工小李20 小时前
VOFA修改数据解析GPCHC
开发语言·qt
专注echarts研发20年1 天前
工业级 Qt 业务窗体标杆实现・ResearchForm 类深度解析
数据库·qt·系统架构
世转神风-1 天前
qt-字符串版本与数值版本互转
开发语言·qt
资深流水灯工程师1 天前
基于Python的Qt开发之Pyside6 串口接收数据被分割的解决方案
开发语言·python·qt
羊小猪~~1 天前
【QT】--文件操作
前端·数据库·c++·后端·qt·qt6.3
赵民勇2 天前
Qt QML 注册宏详解
qt