zoukankan      html  css  js  c++  java
  • 让你的 Qt 桌面程序看上去更加 native(五):QDialog

    让你的 Qt 桌面程序看上去更加 native(五):QDialog

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/491509
     
     

    虽然 Nokia 刚刚宣布和微软合作,推出 WP7 的智能手机,现在 IT 界依然一片哗然(不过也是在意料之中),但这并不会影响我们对于 Qt 的兴趣。好了,现在我们来看的是关于 QDialog 的一些东西。

    首先先来看 QDialog 的一副截图(出自 Qt Developer Day, 2009):

    在这里,我们要注意的是不同平台之上对话框的按钮的不同。其实这是同一段代码编译的,没有使用条件编译技术。那么是如何做到的呢?答案是使用 QDialogButtonBox 这个类。

    QDialogButtonBox 用于管理对话框按钮的顺序、布局、文本和图标等,以保证这些在不同平台能够具有不同表现。如果我们没有 Mac 系统,我们怎么知道该如何布局按钮呢?我们怎么获得这些按钮在不同平台上的图标呢?这些都不会成为我们实现程序的障碍,因为使用 QDialogButtonBox 就足够了。例如,要实现上面的效果,我们只需要一行代码:

    1. QDialogButtonBox box(QDialogButtonBox::Save |   
    2.                       QDalogButtonBox::Discard |  
    3.                       QDialogButtonBox::Cancel);  

    这样,Qt 就会在不同的平台做出不同的表现。

    QDialogButtonBox 为不同的按钮分配不同的角色来实现这一功能。因此,我们在上面的 QDialogButtonBox::Save 这些实际都是一个简单的 enum,用于标记按钮的角色。如果你需要使用自己的按钮,并且为之附加角色,那么可以使用下面的代码:

    1. QDialogButtonBox box;  
    2. box.addButton(myButton, QDialogButtonBox::AcceptRole); 

    这样,myButton 的角色就是 QDialogButtonBox::AcceptRole,而 QDialogButtonBox 也能够根据这个角色为之分配合适的图标和位置等等。

    QDialogButtonBox 先告一段落,下面来说说模态对话框。什么是模态对话框?所谓模态,就是在对话框弹出来之后,能够阻塞后面的窗口。Windows 上一般在退出时会弹出来一个问你是否保存的对话框,就是一个模态对话框。当它出现的时候,后面的窗口是不能点击的,必须要你关闭这个对话框之后才可以。在 Qt 实现模态对话框很简单:

    1. MyQDialogSubclass dialog;   
    2. // Various bits of initialization   
    3. if (dialog.exec() == QDialog::Accept)  {  // HERE!!! 
    4.  // Set new values or do extra work       
    5.  // based on results.   

    这段代码在运行时,会在标记 HERE 注释这行阻塞,具体是 QDialog::exec() 这个函数。这之后的代码在你关闭 dialog 对话框之后才会被执行。利用这一技术,你就可以在 if 里面获取依赖于对话框返回值的数据。例如,对话框用于收集用户数据等。

    1. class MyDialog : public QDialog 
    2. public
    3.     QString name; 
    4. }; 
    5. // .... 
    6. MyDialog d; 
    7. if(d.exec() == QDialog::Accept) { 
    8.     QString name = d.name; 
    9.     // do something with name... 

    上面的代码,MyDialog 用于用户输入 name 的值。我们使用模态对话框,就可以在 if 里面获取这个值了。

    不过,不同平台上的模态对话框的使用方式是不一样的。比如,Windows 平台上,模态对话框用于严重错误的提示,或者是在继续之前必须完成的任务;KDE 上,模态对话框用于可能造成数据丢失或者严重后果的交互。

    Qt 中,对话框的打开具有三种方式:

    • QDialog::show(): 非模态
    • QDialog::exec(): 模态
    • QDialog::open(): 窗口模态

    前两种我们很容易理解,下面来看看什么是窗口模态。比如,我们有两个窗口(以下图示来自 Qt Developer Day, 2009):

    使用如下代码,我们用 open() 函数打开一个对话框:

    1. if(!messageBox) { 
    2.     messageBox = new QMessageBox("SDI"
    3.                                  "The document has been modified. \n" 
    4.                                  "Do you want to save your changes?"
    5.                                  QMessageBox::Warning, 
    6.                                  QMessageBox::Yes | QMessageBox::Default, 
    7.                                  QMessageBox::No, 
    8.                                  QMessageBox::Cancel | QMessageBox::Escape, 
    9.                                  this); 
    10.     connect(messageBox, SIGNAL(finished(int)), SLOT(handleDialogClose(int))); 
    11. messageBox->open(); 

    看看运行的结果:

    这就是 open() 函数的效果:它类似模态对话框,但是只会阻塞一个窗口,而不是将整个系统阻塞掉。

    最后一个要说的技术是 QFormLayout。这个布局用于展示表单。来看一下下面的截图(出自 Qt Developer Day, 2009):

    注意这里的文本对齐方式和按钮的顺序。前面已经说过用 QDialogButtonBox 实现不同平台下按钮的顺序,而上面的对齐方式则是使用 QFormLayout 实现,例如:

    1. QFormLayout *layout = new QFormLayout; 
    2. layout->addRow(tr("Name:"), nameLineEdit); 
    3. // more... 

    这样,我们又能够使用简单的代码实现不同平台的不同布局表现。

    本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/491509

  • 相关阅读:
    tcp/udp并发(大吞吐量)性能测试工具
    postman prerequest动态加密数据构造
    匹配ip的正则表达式
    通过adb命令保存并重命名截图
    python3 urlencode及urldecode
    Android安全测试工具Drozer coverity fortify
    windows下adb shell命令杀进程方式
    postman批量构造数据
    Android app发热功耗思路
    Jenkins+ant+Jenkins接口持续集成测试配置
  • 原文地址:https://www.cnblogs.com/dongxiao/p/2544362.html
Copyright © 2011-2022 走看看