Qt模态界面设置setWindowModality禁止其他界面响应

一、模态与非模态

模态:启动模态界面时,例如弹出对话框强制用户从其他正在进行的业务中聚焦到当前对话框,除了该对话框整个应用程序窗口都无法接受用户响应,无法切换界面,无法切换当前Qt应用。这可以保证用户按照自己设计的操作逻辑进行动作。只有关闭和退出该模态界面,才可以访问本应用程序的其他界面和功能。

非模态:与模态相反,默认状态为非模态,即可以随意切换,可以在同一应用下的各个窗口界面任意切换。

半模态:介于二者之间,冻结窗口界面,但其他应用继续执行响应。

二、使用方法

Qt中的QWidget对象自带setWindowModality(type)方法,用以设置窗口模态类型。

参数type可选为一下三种:

  1. Qt::NonModal 非模态:正常模式
  2. Qt::WindowModal 半模态:窗口级模态对话框,阻塞父窗口、父窗口的父窗口及兄弟窗口。
  3. Qt::ApplicationModal 模态:应用程序级模态对话框,阻塞整个应用程序的所有窗口。

三、代码示例

void MainWindow::on_toolButton_NewWidget_clicked()
{
    Widget_ui *new_ui = new Widget_ui(this);//创建新界面窗口
    new_ui->setWindowModality(Qt::ApplicationModal);//设置模态
    connect(new_ui,&new_ui->Tx_NewSig,this,&MainWindow::Rx_NewSig);//绑定当前界面的信号槽
    new_ui->show();//显示当前新创建的界面窗口
}

 

Qt中,可以使用信号和槽机制来实现异步更新界面。具体来说,当异步任务完成后,可以通过信号触发槽函数来更新界面。以下是一个简单的示例: ```cpp // 异步任务类 class MyTask : public QObject { Q_OBJECT public: MyTask(QObject *parent = nullptr) : QObject(parent) {} signals: void taskFinished(QString result); public slots: void startTask() { // 模拟耗时任务 QThread::sleep(5); // 发送信号,携带任务结果 emit taskFinished("Task finished!"); } }; // 界面类 class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) {} public slots: void onTaskFinished(QString result) { // 更新界面 m_label.setText(result); } void onButtonClicked() { // 创建异步任务对象 MyTask *task = new MyTask(this); // 连接信号和槽函数 connect(task, &MyTask::taskFinished, this, &MyWidget::onTaskFinished); // 启动异步任务 QThread *thread = new QThread; task->moveToThread(thread); connect(thread, &QThread::started, task, &MyTask::startTask); thread->start(); } private: QLabel m_label; QPushButton m_button{"Start Task"}; }; ``` 在上面的示例中,当用户点击`Start Task`按钮时,会创建一个异步任务对象`MyTask`,并将其移动到一个新线程中执行。当任务完成后,会通过信号`taskFinished`触发槽函数`onTaskFinished`,从而更新界面。 如果需要在异步任务执行期间让界面模态等待,可以使用`QEventLoop`类来阻塞界面事件循环。以下是一个示例: ```cpp // 界面类 class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { connect(&m_button, &QPushButton::clicked, this, &MyWidget::onButtonClicked); } public slots: void onTaskFinished(QString result) { // 更新界面 m_label.setText(result); // 停止事件循环 m_eventLoop.quit(); } void onButtonClicked() { // 创建异步任务对象 MyTask *task = new MyTask(this); // 连接信号和槽函数 connect(task, &MyTask::taskFinished, this, &MyWidget::onTaskFinished); // 启动异步任务 QThread *thread = new QThread; task->moveToThread(thread); connect(thread, &QThread::started, task, &MyTask::startTask); thread->start(); // 开始事件循环 m_eventLoop.exec(); // 界面模态等待,直到任务完成 } private: QLabel m_label; QPushButton m_button{"Start Task"}; QEventLoop m_eventLoop; }; ``` 在上面的示例中,当用户点击`Start Task`按钮时,会创建一个异步任务对象`MyTask`,并将其移动到一个新线程中执行。然后,通过调用`QEventLoop::exec()`函数开始事件循环,从而阻塞界面。当任务完成后,会通过信号`taskFinished`触发槽函数`onTaskFinished`,从而更新界面并停止事件循环。这样,界面就会在任务执行期间模态等待,直到任务完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值