Qt-QDialog,QWidgetはモダリティおよび非モーダルを実現する.

8473 ワード

転載元: http://www.360doc.com/content/15/0825/16/20016257_4946565.0 shtml
QtではQDialogは「ウィンドウ」であり、QWidgetは「部品」であり、まず「Qtウィンドウと部品の概念」を理解する.
に対する QDialog のモダリティと非モダリティは直接実現できるもので、多くの教科書の中で言及されています.ここでまとめます.
モダリティQDialog
方式一:
 
   

QDialog dlg(this); dlg.exec();

方式二:
 
   

QDialog *pDlg=new QDialog(this); pDlg->setModal(true); pDlg->show();

非模态QDialog
 
   

QDialog *pDlg=new QDialog(this); pDlg->show();


QDialog实现模态非模态很简单,但是对于QWidget有点迷茫,QWidget中没有exec(),也没有setModal()方式,但是想想看,QWidget作为QDialog的基类,而且QWidget作为“窗口”使用也是在平常不过了,所以会意识到QWidget中是否存在一个相对exec()或setModal()更基本的操作来实现模态和非模态呢?就这样,我找到了setWindowModality(),此函数就是用来设置QWidget运行时的程序阻塞方式的,参数解释如下:
Qt:: NonModal 不阻塞
Qt:: WindowModal 阻塞父窗口,所有祖先窗口及其子窗口
Qt:: ApplicationModal 阻塞整个应用程序

看来, setModal()也就是使用 setWindowModality()设置Qt:: ApplicationModal参数也实现的模态。

如此,要实现QWidget的模态和非模态,只要调用 setWindowModality()设置阻塞类型就好了:
QWidget *pWid = new QWidget(this);
pWid->setWindowModality(Qt::ApplicationModal);
//pWid->setAttribute(Qt::WA_ShowModal, true);
pWid->show();
しかし、運転中にモーダル効果は実現されていませんでした.ここで注意が必要です.ご利用を希望されたら.
set WindowModality()QWidgetをモードに設定する場合、QWidgetの親部品は0を保証し、ここでQWidget*pWid=new QWidget(this)を修正します.QWidget*pWid=new QWidget(NULL);運行しているといいです.
また、
set WindowModality()モードウィンドウの設定は唯一の方式ではなく、直接ウィジェット(またはウィンドウ)の属性を設定しても良いです.
pWid->set Attribute(Qt:WA Show Modal、true)-------
また、QDialogを作成した後、set WindowFlags(Qt:Fraameless WindowHity)を使用する場合、注意すべき点が多いです.タイトルバーを削除すると、このダイアログは親ウィンドウをブロックしなくなります.ブロック効果を達成するためには、再びQtを指定できます.
setwindowFlags(Qt:
Dialog | Qt:
Fraameless WindowHit)//これで親の窓口がふさがります.
しかし、このようにすると、ダイアログの半透明(または透明)表示に影響します.Qt:Dialogを使用する前に半透明表示が正常です.
使った後は死んでしまいました.
--どうしたらいいか分かりません. 
--------------
要するに
モダリティとQDialogとQWidgetのいずれでもモダリティと非モーダル.exec()、ショー()ができます. などの関数は直接関係なく、ウィンドウの属性だけに関係があります.次の2つの方法を使ってもいいです.
set Attribute(Qt:WA Show Modal、true);属性の設定
set WindowModality(Qt:Apple Modal)//ブロックタイプを設定
----------------
QDialogのメンバー関数set Modalとexecのモダリティは彼が先にウィンドウのプロパティを設定したからです.set Attribute()を再ショーします.