QWidget实现模态及非模态

1、对QWidget设置模态窗口有两种方法:
第一种是在构造函数中
       setWindowFlags(Qt::FramelessWindowHint);
        setAttribute(Qt::WA_showModal, true);
        但这种方法已经在Qt4.5中被摒弃了,因为按照这样设置,对话框是无法使用触摸屏输入法的,只能用按键输入;
第二种是在构造函数中
       setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
       
setWindowModality(Qt::WindowModal);
        其中Qt::Dialog这个属性是要加的,因为这个属性会告诉Qt这个窗口是要被当做对话框对待的,从而实现预期的效果。而下面那个函数的参数有3种:
        Qt::NonModal :该窗口不是模态,不会阻塞其它界面接受输入信息;
        Qt::WindowModal:该窗口是一个当以层次的模态窗口,会阻塞它的父窗口、祖父窗口和各个兄弟窗口接受输入信息;
        Qt::ApplicationModal:该窗口是应用模态窗口,会阻塞所有窗口接受输入信息。
        用第二种就能够在弹出来的对话框中接收输入法信息。
2、设置了模态却没有用的原因:
        因为设置模态会的时候,Qt会根据当前窗口的父窗口是哪个,一步步往上找,然后将应该阻塞的全部阻塞,故没有效果的原因是没有父窗口。
        比如在一个QWidget中new一个自定义对话框,该对话框设置为setWindowModality(Qt::WindowModal),然后将这个QWidget里面的按键clicked()信号和对话框的show()槽函数连接起来,一旦点击就show对话框。这样创建完后却发现窗口不是模态的,原因就是没有父窗口!首先对话框是不可能用布局将其管理起来,所以其父窗口是默认0。或许有些人说在new的时候将父窗口的this传进去了,但是模态窗口的属性是在对话框创建的时候确定的,可此时父窗口QWidget根本就还没有完全创建完,因此parent还是0,故设置对话框失效!解决办法就是自定义一个槽函数,当按键按下时才在槽函数里面创建对话框,此时QWidget已经创建完成,可以将this传入,这样就能够获得预想的结果。

例如:

 
TimerWidget的构造函数里写上:
TimerWidget::TimerWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
this->setWindowModality(Qt::WindowModal);//阻挡父亲窗口内其他控件,除非本dialog关闭
}

/**
* @brief 设置清洗  ---槽函数
*/
void ParamWidget::on_setClearBtn_clicked()
{
QWidget* mainForm = Global::getMainForm();
if (m_timerWidget == 0)
{
m_timerWidget = new TimerWidget(mainForm);//父窗口传进来

}
m_timerWidget->show();
}

转自:https://blog.csdn.net/maybe______/article/details/52983533

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值