WDialog显示出一个对话框。
默认情况下,对话框是 模态的(modal) 。模态对话框会冻结用户界面 ,并且在对话框关闭之前不允许用户与用户界面的任何其它部分进行交互 (这是由服务器端控制的 ,所以你可以依赖它的行为 )。
有两种截然不同的使用WDialog 窗口的方法。
WDialog可以像任何其它部件一样使用。在这种情况下,WDialog只是简单地像另一个部件一样实例化。可通过调用 accept() 、 reject() 或 done() (或者将一个信号连接到其中一个方法)来关闭对话框。这个动作会将对话框隐藏并且发射 finished() 信号,你可以监听那个信号以 便处理对话框的结果并且删除那个对话框。与其它部件不同的是 ,对话框不需要添加到亲代部件中 ,而且默认情况下是隐藏的。你必须使用 show() 方法或者setHidden(true)来显示那个对话框 。
最简单的显示一个模态对话框的方法就是使用exec():在创建咯一个WDialog 窗口之后,调用 exec() 就会阻塞 住(挂起线程),直到对话框 被关闭,并且返回对话框的结果 。典型地 ,会有一个确定(OK)按钮被连接到 accept() ,并且在某些情况下会有一个取消 (Cancel)按钮被连接到 reject() 。这种解决方案有一个弊端 ,它不适合处理多个并行的会话,因为对于每个位于递归 (recursive)的事件循环中(在 exec() 方法中运行)的会话来说, 都有一个线程被阻塞。从实用的角度来说 ,这就意味着它只适合于那种带有严格的访问限制或者是部署在一个内部网 (intranet)或外联网(extranet)上的软件。
使用setModal(false)来创建一个非模态(non-modal)对话框。非模态的对话框不阻塞下层的用户界面 :用户不需要在与用户界面的其它部分交互之前先处理对话框 。
通过添加东西到contents()部件中来创建对话框的内容。
使用示例,使用exec()方法:
Wt::WDialog dialog("Personalia");
new Wt::WText("Enter your name: ", dialog.contents());
Wt::WLineEdit edit(dialog.contents());
new Wt::WBreak(dialog.contents());
Wt::WPushButton ok("Ok", dialog.contents());
//这些事件会使得对话框接受(accept())
edit.enterPressed().connect(&dialog, &Wt::WDialog::accept);
ok.clicked().connect(&dialog, &Wt::WDialog::accept);
if (dialog.exec() == Wt::WDialog::Accepted)
setStatus("Welcome, " + edit.text());
对话框是这样的(标准外观):
一个简单的自定义对话框 (默认主题) |
一个简单的自定义对话框 (漂亮主题) |
对话框拥有Wt-dialog 和Wt-outset 样式类。外观可使用以下样式类选择器来替换 :
.Wt-dialog .titlebar : 标题栏
.Wt-dialog .body : 窗口主体(要求 4像素 的竖向填充间距 (padding) )。
注意 :
为咯使对话框(或者准确地说 ,覆盖下面的用户界面的屏幕内容 ( silkscreen ) )在IE中正确地显示 ,"html body"间距 (margin)会被设置成0(如果还没这麽设置的话)。
HxLauncher: Launch Android applications by voice commands