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(); // 阻塞直到窗口关闭
相关推荐
实心儿儿16 小时前
Qt — 信号和槽
qt
江湖人称菠萝包17 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter8-绘图
笔记·qt·qt5
西西弗Sisyphus18 小时前
Qt 实现一个 水波进度球
c++·qt·c
RAN11426760081 天前
1.3第一个程序的介绍
开发语言·qt
实心儿儿2 天前
Qt — 命名方式、坐标系
qt
小小龙学IT2 天前
Qt QPainter 2D 绘图系统深度解析:从画笔到渲染引擎适
c++·qt
深兰科技2 天前
深兰科技受邀参与第二届中国(南宁)—东盟人工智能场景应用对接会,深化AI国际合作
人工智能·qt·r语言·scala·symfony·智能机器人·深兰科技
实心儿儿2 天前
Qt — 对象树
qt
Quz2 天前
QML Repeater 数据模型:ListModel 与 C++ QAbstractListModel
qt
Quz2 天前
QML Repeater 基础用法:整数、JS 数组、字符串数组三种模型
qt