模态对话框ModalDialogBox
- 格式:ppt
- 大小:3.12 MB
- 文档页数:26


详解 Qt 模态对话框和非模态对话框
2011-07-01 11:33
佚名 互联网 我要评论(0) 字号:T | T
如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。
AD:
Qt 模态对话框和非模态对话框 是本文介绍的内容,本文认为本篇是一篇很有意思的文章,不多说,我们先来看内容。
模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口。非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框。
如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。
和所有流行的图形类库一样,Qt也提供了创建模态和非模态对话框的机制。
在Qt中创建模态对话框,主要用到了QDialog的exec函数:
1. SonDialog dlg(this);
2. int res = dlg.exec();
3. if (res == QDialog::Accepted)
4. {
5. QMessageBox::information(this, "INFORMATION", "You clicked OK button!");
6. }
7. if (res == QDialog::Rejected)
8. {
9. QMessageBox::information(this, "INFORMATION", "You clicked CANCEL button!");
10. }
正如上面代码所显示的,可以通过exec函数的返回值来判断用户点击了哪个按钮使得模态对话框退出的,这可以使得我们能够根据用户的不同行为在推出退出模态对话框之后采取不同的处理方法。
html简单的模态对话框
CSS样式:
html:
{% csrf_token %}
{% for row in v1 %}
{{ row.caption }}
{% endfor %}
script:
因为我们同事给遮罩层和输⼊框加上了hide样式(⾃动隐藏),所以当点击添加的时候就让遮罩层和输⼊层弹出。点击输⼊框⾥⾯的取消时候
(id=quxiao),继续隐藏
⼩笔记:
$(function(){});相当于$(document).ready() 。
$(function(){});意思是当页⾯加载完这个script标签就会执⾏⾥边的代码了。需求:我想做⼀个页⾯,不想让⽤户点击事件才显出动态效果,
⽽是想让html加载完成以后⾃动出现动态效果。那么这样我们就可以把动态效果的⽅法直接写到$(function(){});这⾥⾯。写法如上:
⼩记:
html:
编号
服务器名称
IP地址
端⼝
业务线
操作
{% for row in v2 %}
{{ row.nid }}
{{ row.hostname }}
{{ row.ip }}
{{ row.port }}
{{ row.b.caption }}
{% endfor %}
模态对话框的form表单:
{% csrf_token %}
{% for row in v1 %}
{{ row.caption }}
{% endfor %}
jquery:
function edit(hostname,ip,port,bid){
$('.shade,.mode').removeClass('hide');
var h = $(this);
$('#host').val(hostname)
$('#ip').val(ip)
$('#port').val(port)
模态对话框和非模态对话框的区别
假设对话框类名为:CTestDlg
1,如果是模态对话框:
CTestDlg ctd;//创建该对话框对像
ctd.DoModale();
2,如果是非模态的:
CTestDlg *p_ctd= new CTestDlg();//创建对话框的对像指针
p_ctd->Create(IDD_READING,this);//指针调用Create()函数,ID号为对话框的.
p_ctd->ShowWindow(SW_SHOWNA);//()中的参数可以用来改变对话框的显示模式(具体参见MSDN中ShowWindow()函数)
模态对话框创建后一定要在用户单击完对话框上的"确定"或"取消"或"关闭",也就是对它进行了响应并关闭后,程序才能继续执行.
而非模态的则是创建完后程序可以继续执行,对话框可以成为后台对话框.所以也可以用函数来关闭
p_ctd->DestroyWindow();
模态对话框就是指那种“显示出来就不可以点选位于其下面的对话框”的对话框;反之的就是非模态对话框。
两者的区别:
一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。
二. 非模态对话框对象是用new操作符来动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建的。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。
三. 通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两者之间区别的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆栈中构建对话框对象,而不能以局部变量的形式来构建之。
1. 模态对话框
在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念
模态对话框:在子界面活动期间,父窗口是无法进行消息响应。独占用户输入
非模态对话框:各窗口之间不影响
主要区别:非模态对话框与APP共用消息循环,不会独占用户。
模态对话框独占用户输入,其他界面无法响应
在用户层的主要逻辑如下:
1 TestDlgdlg;
2
3 if (dlg.DoModal() == IDOK)
4 {
5 //处理完毕后的操作
6 }
7 .......//后续处理
在具体实现中,有如下几个步骤:
1. 让父窗口失效 EnableWindow(parentWindow, FALSE)
2. 建立模态对话框自己的消息循环(RunModalLoop)
3. 直至接收关闭消息,消息循环终止,并销毁窗口。
01 INT_PTR CDialog::DoModal()
02 {
03 //对话框资源加载
04 ......
05
06 //在创建模态窗口之前先让父窗口失效,不响应键盘、鼠标产生的消息 07 HWND hWndParent = PreModal();
08 AfxUnhookWindowCreate();
09 BOOL bEnableParent = FALSE;
10
11 if (hWndParent&&hWndParent != ::GetDesktopWindow()
&& ::IsWindowEnabled(hWndParent))
12 {
13 ::EnableWindow(hWndParent, FALSE);
14 bEnableParent = TRUE;
15 .......
16 }
17