• 9080阅读
  • 21回复

[提问]模态对话框不模态的问题 [复制链接]

上一主题 下一主题
离线hjh2008
 

只看楼主 倒序阅读 楼主  发表于: 2011-11-07
首先用QWidget作为主界面创建了一个程序,在主界面下按一个按钮弹出一个QDialog对话框程序如下:
    New_Dialog dlg(this);
    dlg.exec();
但是显示对话框不是模态的。

如果给dlg传NULL指针是模态的,如下:
    New_Dialog dlg(NULL);
    dlg.exec();

因为我是自定义背景的对话框,必须传this指针才能以主界面作为背景。在dlg对话框里加setModal(true) 也么用!

所以怎样使对话框为模态?

离线jdwx

只看该作者 1楼 发表于: 2011-11-07
回 楼主(hjh2008) 的帖子
New_Dialog dlg(this);
dlg.exec();
如果New_Dialog 是QDialog 那么 dlg.exec();一定会是模态。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线hjh2008

只看该作者 2楼 发表于: 2011-11-07
回 1楼(jdwx) 的帖子
问题是它就是不模态,New_Dialog dlg(NULL); 才会模态,但不是我要的效果!


我想是不是跟自定义背景的对话框有关系? 还是跟父窗口有关系,父窗口也是自定义背景的QWidget
离线jdwx

只看该作者 3楼 发表于: 2011-11-07
回 2楼(hjh2008) 的帖子
我的messagebox都是这个样子了,也是模态。
还是上代码吧。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线hjh2008

只看该作者 4楼 发表于: 2011-11-07
回 3楼(jdwx) 的帖子
是的,直接用QMessageBox是模态的,看来是对话框的问题,不是父窗口的问题。

上代码:
New_Dialog.h
//////////////////////////////////////////
#ifndef NEW_DIALOG_H
#define NEW_DIALOG_H

#include <QDialog>
#include "New_Button.h"

class New_Dialog : public QDialog
{
    Q_OBJECT

public:
    New_Dialog(QWidget *parent = 0);
    ~New_Dialog();
protected:  
    void paintEvent(QPaintEvent *);//这个在窗口需要重绘的时候自动调用  
private:
    QPixmap backgroundImage;
    New_Button *OKButton;
};
#endif // NEW_DIALOG_H


New_Dialog.cpp
////////////////////////////////////////////////////////////
#include "New_Dialog.h"
#include <QtGui>

New_Dialog::New_Dialog(QWidget *parent/*,QString information*/)
    : QDialog(parent)
{
    //ui.setupUi(this);
    //设置窗体没有边框
    setWindowFlags(Qt::FramelessWindowHint);
    //设置背景图片
    backgroundImage.load(":/Application/informationDialog.png");  
    resize(backgroundImage.size());  
    setMask(QBitmap(backgroundImage.mask()));

    OKButton=new New_Button(this,":/Application/OK.png");
    OKButton->setGeometry(214,230,OKButton->width(),OKButton->height());
    connect(OKButton,SIGNAL(clicked()),this,SLOT(accept()));

    move(200,150);
}

New_Dialog::~New_Dialog()
{

}

void New_Dialog::paintEvent(QPaintEvent *event)  
{  
    QPainter painter(this);  
    painter.drawPixmap(0,0,backgroundImage);  
}

//////////////////////////////////////////////////////////////

请帮忙分析一下是什么问题,谢谢!
离线shiziyang

只看该作者 5楼 发表于: 2011-11-07
你的父窗体是widget还是dialog,不是dialog的话换成dialog试试
离线jdwx

只看该作者 6楼 发表于: 2011-11-07
回 4楼(hjh2008) 的帖子
测试结果:绝对是模态的,没问题。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线zhy282289
只看该作者 7楼 发表于: 2011-11-07
不懂你的为什么会是这样你的设下这个吧
dlg->setAttribute(Qt::WA_ShowModal);
为什么我脸这么胖~
离线hjh2008

只看该作者 8楼 发表于: 2011-11-07
回 6楼(jdwx) 的帖子
父窗口改成QDialog也没用还是非模态的。

怎样解释以下这两个现象?
1、在父窗口中用New_Dialog dlg(NULL);    dlg.exec();是模态的;
      用New_Dialog dlg(NULL);    dlg.exec();是非模态的?

2、QMessageBox dlg(this);  dlg.exec() 是模态的?
离线jdwx

只看该作者 9楼 发表于: 2011-11-07
回 8楼(hjh2008) 的帖子
我这里没问题,肯定是模态的。
测试用的程序:
附件: m.rar (867 K) 下载次数:6
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线hjh2008

只看该作者 10楼 发表于: 2011-11-08
回 9楼(jdwx) 的帖子
谢谢! 我试了一下你的代码; 定义对话框的时候加一个this就不模态了,如下:
  
    CDialog dlg(this);
    dlg.exec();
离线jdwx

只看该作者 11楼 发表于: 2011-11-08
回 10楼(hjh2008) 的帖子
确实如此,不加this就是了,从来没注意过。
加this就变成子窗口。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线zhy282289
只看该作者 12楼 发表于: 2011-11-08
跟你的setWindowFlags(Qt::FramelessWindowHint);有问题..去掉就好了.具体为什么我也不知道
为什么我脸这么胖~
离线hjh2008

只看该作者 13楼 发表于: 2011-11-08
回 12楼(zhy282289) 的帖子
确实与setWindowFlags(Qt::FramelessWindowHint);有关!

不过我做的是不规则的窗体,必须要有这句的。

有没有其它的设置,再保留这句的情况下让它可以变成模态的?
离线zhy282289
只看该作者 14楼 发表于: 2011-11-08
回 13楼(hjh2008) 的帖子
好吧找到原因了.你setFlags的时候把dialog的状态也清了,这个就可以了
setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
为什么我脸这么胖~
离线hjh2008

只看该作者 15楼 发表于: 2011-11-08
回 14楼(zhy282289) 的帖子
试了setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); 效果,它和没传this指针的效果是一样的,是会变成模态对话框,但不是我要的效果,因为我的对话框有半透明的效果,如果不传this指针作为父窗口,透明效果就无法正常显示。
离线zhy282289
只看该作者 16楼 发表于: 2011-11-08
回 15楼(hjh2008) 的帖子
O O我传this是可以的啊~
为什么我脸这么胖~
离线hjh2008

只看该作者 17楼 发表于: 2011-11-08
回 16楼(zhy282289) 的帖子
是可以啊  但是效果不对啊,如下图边框周围本来是透明色的变成了白色




要的效果是这样的
周围有点阴影的。
离线jdwx

只看该作者 18楼 发表于: 2011-11-08
回 15楼(hjh2008) 的帖子
原来如此,你的主窗口也是透明的。
想让窗口透明,在构造函数里添加:setAttribute(Qt::WA_TranslucentBackground);
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线hjh2008

只看该作者 19楼 发表于: 2011-11-08
结合上面的方法,搞定了,谢谢!

但是其中的问题,还是没搞清楚
离线roywillow

只看该作者 20楼 发表于: 2011-11-08
Qt::WA_TranslucentBackground会允许背景使用alpha通道,之后只要在paintEvent中绘制带alpha通道的图就会出来透明了
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线zhy282289
只看该作者 21楼 发表于: 2011-11-08
回 19楼(hjh2008) 的帖子
我晕死,你一次说完啊,否则别人也只解决你提的那个问题嘛
为什么我脸这么胖~
快速回复
限100 字节
 
上一个 下一个