QT 窗口 模态和非模态切换总结

男娘i 2022-05-22 22:34 635阅读 0赞

1、主要讲的是对QWidget设置模态窗口

第一种方法:是在构造函数中写上:

  1. setWindowFlags(Qt::FramelessWindowHint);
  2. setAttribute(Qt::WA_showModal, true);

但这种方法已经在Qt4.5中被摒弃了,因为按照这样设置,对话框是无法使用触摸屏输入法的,只能用按键输入;

第二种方法:是在构造函数中写上:

  1. setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
  2. setWindowModality(Qt::WindowModal);

其中Qt::Dialog这个属性是要加的,因为这个属性会告诉Qt这个窗口是要被当做对话框对待的,从而实现预期的效果。而下面那个函数的参数有3种:Qt::NonModal :该窗口不是模态,不会阻塞其它界面接受输入信息;Qt::WindowModal:该窗口是一个当以层次的模态窗口,会阻塞它的父窗口、祖父窗口和各个兄弟窗口接受输入信息;Qt::ApplicationModal:该窗口是应用模态窗口,会阻塞所有窗口接受输入信息。用第二种就能够在弹出来的对话框中接收输入法信息。

2、但是用了上面第二种方法设置了模态,还是没用的原因:

答案:因为你没设置父窗口,qt帮助文档原文是:

The window is modal to a single window hierarchy and blocks input to its parent window, all grandparent windows, and all siblings of its parent and grandparent window

  1. 因为设置模态会的时候,Qt会根据当前窗口的父窗口是哪个,递归往上层找,然后将应该阻塞的全部阻塞,故没有效果的原因是该Widget没有父窗口。
  2. 或许有些人说在new widget的时候,将父窗口的this指针传进去了,但是模态窗口的属性是在对话框创建的时候确定的,可若是父窗口QWidget根本就还没有完全创建完,因此parent还是0,故设置对话框失效!

解决办法就是自定义一个槽函数,当按键按下时才在槽函数里面创建对话框,此时QWidget已经创建完成,可以将this传入,这样就能够获得预想的结果。

例如:

c9bdddcec3fdfc032d333cf5d13f8794a5c226f1.jpg

在TimerWidget的构造函数里写上:

  1. TimerWidget::TimerWidget(QWidget *parent)
  2. : QWidget(parent)
  3. {
  4. ui.setupUi(this);
  5. this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
  6. this->setWindowModality(Qt::WindowModal);//阻挡父亲窗口内其他控件,除非本dialog关闭
  7. }
  8. /**
  9. * @brief 设置清洗 ---槽函数
  10. */
  11. void ParamWidget::on_setClearBtn_clicked()
  12. {
  13. QWidget* mainForm = Global::getMainForm();
  14. if (m_timerWidget == 0)
  15. {
  16. m_timerWidget = new TimerWidget(mainForm);//父窗口传进来
  17. }
  18. m_timerWidget->show();
  19. }

参考链接:https://jingyan.baidu.com/article/e73e26c0a2607a24adb6a7d5.html

发表评论

表情:
评论列表 (有 0 条评论,635人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Qt

    模态是指当子窗口弹出时,焦点始终被强行集中于子窗口,只要子窗口不退出,焦点就不会被释放。非模态正好相反。 从线程角度讲,模态子窗口的线程是阻塞的,父、子窗口各有一个线程,当创

    相关 Angularjs 窗口

    对话框的两种类型:模态类型和非模态类型 1 模态窗口 打开模态窗口后,只要不关闭该窗口,鼠标焦点或者光标就会一直停留在该窗口上。只有关闭该窗口后,调用窗口才能继续