魔方网表 让信息化更简单

 找回密码
 注册
查看: 23125|回复: 3

Qt系列教程【2.4】形状能改变的对话框(Shape-Changing Dialogs)

[复制链接]
admin 发表于 2008-11-25 09:44:00 | 显示全部楼层 |阅读模式
前面几章我们设计的对话框都是不能改变它的样子的。但是有时需要对话框根据要求进行适当的改变。两个最常用的需要改变的对话框是可扩展对话框和多页对话框。这两种类型的可以通过代码编写,也可以用Qt Designer设计。
可扩展对话框通常外观简单,带有一个可扩展按钮来切换对话框的简单外观和可扩展外观。这种对话框通常为了迎合普通用户和高端用户而设计的,如果没有特别请求隐藏高级应用部分。在这一节,我们使用Qt Designer设计一个可扩展对话框.
对话框是一个表格程序的排序对话框,对用户选择的一些列按要求排序。对话框的简单外观允许用户输入一个简单排序关键词,扩展部分允许输入两个额外的排序关键词。一个More按钮使用户在简单外观和扩展外观进行切换。
我们使用Qt Designer创建这个可扩展的对话框,在运行时刻隐藏高级功能,这个看起来很复杂的对话框用Qt Designer可以很容易实现。首先设计好第一个关键词,第二个和第三个关键词通过复制就可以得到:
1、启动File|New菜单,选择“Dialog with Buttons Right”模板。
2、创建More按钮,并将它拖到右边的垂直布局管理器中,放到垂直空白spacer的下面。设置按钮的文本text属性为“&More”,它的checkable属性为“true”,设置Ok按钮的default属性为true。
3、创建一个组合框,两个标签,两个下拉组合框和一个水平空白spacer,先把它们放在对话框的任何地方。
4、把组合框拖动大些,把3中其他控件拖动到其中,按比例调整位置。
5、第二个下拉框宽度调整为第一个下拉框的二倍。
6、设置组合框的title属性为“&Primary Key”,第一个标签的text属性为“Column:”,第二个标签的text属性为“Order:”。
7、右击第一个下拉框,从弹出菜单中选择Edit项,设置该下拉框的第一个项目文本项为“None”。
8、右击第二个下拉框,同样设置其项目为“Ascending”和“Descending”两个项目,即升序和降序排列。
9、选择组合框,选择Form|Lay Out in a Grid,设置它的布局为Grid。再次选择组合框,选择Form|Adjust Size。
如果设计过程中出现错误,可以选择Edit|Undo或者Form|Break Layout,重新进行排列。当然只要看起来不是很难看,也可以是其他的样子,只要易于理解就是ok。
现在加入第二个,第三个关键词:
1、把对话框拖动到足够大。
2、复制第一个组合框,粘贴两次,一次拖动到下面。
3、把复制的两个组合框的title属性为“&Secondary Key”和“Tertiary Key”。
4、在第一个关键词和第二个关键词组合框之间添加一个垂直空白spacer
5、调整添加的控件。
6、选择这个对话框,选择Form|Lay Out in a Grid,将对话框设置为Grid管理。
7、设置两个垂直空白的sizeHint属性为[20,0]。
按照下图命名每一个控件。命名对话框为sortDialog,窗口标题为“Sort”。
然后设置控件的tab顺序。从上到下点击下拉框,然后点击Ok,Cancel,More按钮。
以上是对话框的设计。然后点击Edit|Edit Signals/Slots, 用Qt Designer建立控件的信号槽连接,Qt Designer可以建立同一窗体的任何控件间的联系。因为我们创建对话框时使用了“Dialog with Buttons Right”模板,Ok和Cancel按钮已经连接到了对话框的accept()和reject()槽函数。进入连接状态,选择发送控件,会出现一红线拖动到接收控件再释放,会出现弹出的对话框,从中可以选择连接的signal/slot。我们需要自己建立的连接是连接More按钮和secondary-GroupBox。选择Edit|Signal/Slots,将编辑状态变为连接状态,拖动More按钮到secondary-GroupBox上,弹出信号编辑对话框。将按钮的toggled(bool)信号和组合框的setVisible(bool)连接。一旦全部连接建立完全,点击Edit|Edit Widgets 离开连接状态
创建一个sort目录,保存对话框文件到sort目录的sortdialog.ui,使用多继承的方式使用这个对话框。
首先新建一个sortdialog.h头文件,代码如下:
  1. #ifndef SORTDIALOG_H
  2. #define SORTDIALOG_H
  3. #include
  4. #include "ui_sortdialog.h"
  5. class SortDialog : public QDialog, public Ui::SortDialog
  6. {
  7. Q_OBJECT
  8. public:
  9. SortDialog(QWidget *parent = 0);
  10. void setColumnRange(QChar first, QChar last);
  11. };
  12. #endif
复制代码
然后新建sortdialog.cpp源文件:
  1. 1 #include
  2. 2 #include "sortdialog.h"
  3. 3 SortDialog::SortDialog(QWidget *parent)
  4. 4 : QDialog(parent)
  5. 5 {
  6. 6 setupUi(this);
  7. 7 secondaryGroupBox->hide();
  8. 8 tertiaryGroupBox->hide();
  9. 9 layout()->setSizeConstraint(QLayout::SetFixedSize);
  10. 10 setColumnRange('A', 'Z');
  11. 11 }
  12. 12 void SortDialog::setColumnRange(QChar first, QChar last)
  13. 13 {
  14. 14 primaryColumnCombo->clear();
  15. 15 secondaryColumnCombo->clear();
  16. 16 tertiaryColumnCombo->clear();
  17. 17 secondaryColumnCombo->addItem(tr("None"));
  18. 18 tertiaryColumnCombo->addItem(tr("None"));
  19. 19 primaryColumnCombo->setMinimumSize(
  20. 20 secondaryColumnCombo->sizeHint());
  21. 21 QChar ch = first;
  22. 22 while (ch <= last) {
  23. 23 primaryColumnCombo->addItem(QString(ch));
  24. 24 secondaryColumnCombo->addItem(QString(ch));
  25. 25 tertiaryColumnCombo->addItem(QString(ch));
  26. 26 ch = ch.unicode() + 1;
  27. 27 }
  28. 28 }
复制代码
在构造函数中,隐藏了第二个和第三个关键词部分。设置对话框的sizeConstraint的属性为QLayout::setFixedSize,这样用户就不能随便改变对话框的大小。
第20行,QWidget::sizeHint() 函数返回控件的理想大小。
下面是main.cpp文件:
  1. #include
  2. #include "sortdialog.h"
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication app(argc, argv);
  6. SortDialog *dialog = new SortDialog;
  7. dialog->setColumnRange('C', 'F');
  8. dialog->show();
  9. return app.exec();
  10. }
复制代码
编译运行这个程序,点击More按钮,查看对话框的改变。
另一种可以改变的对话框是多页对话框。这类对话框也可以用代码或Qt Designer两种方式创建。
QTabWidget 在顶部提供了一个tab 栏,可控制内部的 QStackedWidget.

QListWidget及 QStackedWidget能一起使用。将QListWidget::currentRowChanged() 信号与QStackedWidget::setCurrentIndex() 槽进行连接,用QListWidget的当前项来决定QStackedWidget显示哪一页。
QtreeWidget与QListWidget的方式类似,可以与QStackedWidget一起使用
jbskl 发表于 2012-5-18 12:59:08 | 显示全部楼层
高人啊,真是好东西啊!!
回复

使用道具 举报

agr902 发表于 2013-8-28 05:41:16 | 显示全部楼层
我惊呆了,好贴啊,很难得的好贴
回复

使用道具 举报

你马子有我闹吗 发表于 2014-5-22 10:53:18 | 显示全部楼层
非常感谢~~~~~~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|魔方软件 ( 京ICP备08008787号 )

京公网安备 11010702001722号

GMT+8, 2024-3-29 00:31 , Processed in 0.069836 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表