【Qt】2.1 创建对话框
2018-06-18 00:00:09来源:未知 阅读 ()
QDialog是Qt对话框类,可以直接使用这个类来创建对象并显示出来。
要使用一个对话框,就这样子写:
1 #include <QApplication> 2 #include <QDialog> 3 #include <QHBoxLayout> 4 #include <QLineEdit> 5 #include <QPushButton> 6 7 int mainc(int argc, char *argv[]) 8 { 9 QApplication app(argc, argv); 10 11 // 创建一个对话框对象 12 QDialog * dlg = new QDialog; 13 // 设置对话框标题文字 14 dlg->setWindowTitle("对话框"); 15 16 // 创建一个编辑框和按钮 17 QLineEdit * edit = new QLineEdit; 18 QPushButton * button = new QPushButton("确定"); 19 20 // 创建一个水平布局管理器并将编辑框和按钮添加进去 21 QHBoxLayout * layout = new QHBoxLayout; 22 layout->addWidget(edit); 23 layout->addWidget(button); 24 25 // 设置对话框的布局管理器 26 dlg->setLayout(layout); 27 28 // 显示对话框 29 dlg->show(); 30 31 return app.exec(); 32 }
第11行: 创建一个对话框对象
用到的函数:QDialog::QDialog ( QWidget * parent = 0, Qt::WindowFlagsf = 0 )
函数的说明:构造一个对话框。
第26行:设置对话框的布局管理器
用到的函数:void QWidget::setLayout ( QLayout * layout )
函数的说明:为指定的部件设置一个布局管理器。如果这个部件已经通过setLayout设置了一个布局管理器,则不能再重复设置。只有先删除已有的布局管理器才能再次设置新的布局管理器。
显示效果
你会发现,中文显示成乱码了。
我百度了一下,然后这个文章说明了为何显示为乱码:http://blog.csdn.net/brave_heart_lxl/article/details/7186631
所以按照文章所说的,我只需要添加上这一句话即可。
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
写在setWindowTitle之前的位置就行了。另外可能编译时会出现QTextCodec找不到的问题,只需要加上头文件<QTextCodec>即可。
这就是创建的一个普通的对话框。
同时我们可以通过继承QDialog自己写一个对话框,实现自己的需要的功能。
就不把书上的代码搬上来了,我另外自己写一个。
点击提交之后,
如果点击放弃,
当然了这里没加入退出程序的代码~
新建一个类NewDialog,头文件代码:
1 #ifndef NEWDIALOG_H 2 #define NEWDIALOG_H 3 4 #include <QDialog> 5 6 class QLineEdit; 7 class QPushButton; 8 class QLabel; 9 class QCheckBox; 10 11 class NewDialog : public QDialog 12 { 13 Q_OBJECT 14 15 public: 16 NewDialog(QWidget * parent = 0); 17 18 signals: 19 void infoSubmit(const QString & info); 20 21 public slots: 22 void setOkButtonEnable(); 23 void submitInfo(); 24 void cancelDlg(); 25 26 private: 27 QLineEdit * edit; 28 QPushButton * okButton; 29 QPushButton * cancelButton; 30 QLabel * label_Name; 31 QLabel * label_Hobby; 32 QCheckBox * checkBox1; 33 QCheckBox * checkBox2; 34 QCheckBox * checkBox3; 35 QCheckBox * checkBox4; 36 37 }; 38 39 #endif // NEWDIALOG_H
第6~9行:类的前置声明
第11行:继承QDialog
第13行:继承Qt中的类时,开始位置都需要定义Q_OBJECT,这是Qt的宏,必须加就是了。
第16行:提供一个父对象,默认值为0
第18~19行:自定义信号
类中使用Qt的关键字signals来自定义信号。
比如这里的infoSubmit,用来表明点击了提交按钮。这里面自定义的函数是不用自己写代码的,它只是一个信号。
可以自己手动发射这个信号,如果信号中带有参数,必须传入相应参数即可。
第21~24行:自定义槽
类中使用Qt的关键字public/private/protect slots来自定义公有/私有/保护的槽。
需要自已实现槽的代码。槽可以是公有、私有、保护的,它就像普通的函数,可以被直接调用,也可以当作槽来使用。
槽的参数来自信号的参数,所以,如果槽有若干个参数,如果它和一个信号有连接,那么那个信号也必须有与之对应的若干参数,类型和参数位置必须一致,否则编译出错。
如果信号有参数,槽没有参数,那么信号的参数就会被无视掉,这是可以的。
第27~35行:定义使用到的部件
因为定义时只用到了它们的指针,而没有具体的实例化它们。所以不需要加入头文件。只需要提供类似class QPushButton;这样的前置声明即可。
源文件代码:
1 #include "newdialog.h" 2 3 #include <QtGui> 4 5 NewDialog::NewDialog(QWidget * parent) : QDialog(parent) 6 { 7 // 设置编码格式 8 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); 9 10 // 设置对话框标题 11 setWindowTitle("个人信息"); 12 13 // 新建对象 14 edit = new QLineEdit; 15 16 okButton = new QPushButton("提交(&o)"); 17 okButton->setEnabled(false); 18 cancelButton = new QPushButton("放弃(&c)"); 19 20 label_Name = new QLabel("你的名字(&i)"); 21 label_Name->setBuddy(edit); 22 label_Hobby = new QLabel("你的爱好"); 23 24 checkBox1 = new QCheckBox("运动"); 25 checkBox2 = new QCheckBox("电影"); 26 checkBox3 = new QCheckBox("看书"); 27 checkBox4 = new QCheckBox("游戏"); 28 29 // 设置连接 30 connect(edit, SIGNAL(textChanged(QString)), 31 this, SLOT(setOkButtonEnable())); 32 connect(checkBox1, SIGNAL(clicked(bool)), 33 this, SLOT(setOkButtonEnable())); 34 connect(checkBox2, SIGNAL(clicked(bool)), 35 this, SLOT(setOkButtonEnable())); 36 connect(checkBox3, SIGNAL(clicked(bool)), 37 this, SLOT(setOkButtonEnable())); 38 connect(checkBox4, SIGNAL(clicked(bool)), 39 this, SLOT(setOkButtonEnable())); 40 connect(okButton, SIGNAL(clicked(bool)), 41 this, SLOT(submitInfo())); 42 connect(cancelButton, SIGNAL(clicked(bool)), 43 this, SLOT(cancelDlg())); 44 45 46 // 设置布局 47 48 // 名字 49 QHBoxLayout * layoutName = new QHBoxLayout; 50 layoutName->addWidget(label_Name); 51 layoutName->addWidget(edit); 52 53 // 爱好 54 QVBoxLayout * layoutHobby = new QVBoxLayout; 55 layoutHobby->addWidget(label_Hobby); 56 57 QGridLayout * layoutCheckBox = new QGridLayout; 58 layoutCheckBox->addWidget(checkBox1, 0, 0); 59 layoutCheckBox->addWidget(checkBox2, 0, 1); 60 layoutCheckBox->addWidget(checkBox3, 1, 0); 61 layoutCheckBox->addWidget(checkBox4, 1, 1); 62 63 layoutHobby->addLayout(layoutCheckBox); 64 65 // 提交与放弃按钮 66 QHBoxLayout * layoutButton = new QHBoxLayout; 67 layoutButton->addStretch(); 68 layoutButton->addWidget(okButton); 69 layoutButton->addWidget(cancelButton); 70 71 // 主布局管理器 72 QVBoxLayout * mainLayout = new QVBoxLayout; 73 mainLayout->addLayout(layoutName); 74 mainLayout->addLayout(layoutHobby); 75 mainLayout->addLayout(layoutButton); 76 77 setLayout(mainLayout); 78 79 } 80 81 void NewDialog::setOkButtonEnable() 82 { 83 if(edit->text() == "") 84 { 85 okButton->setEnabled(false); 86 } 87 else if(!checkBox1->isChecked() && !checkBox2->isChecked() && 88 !checkBox3->isChecked() && !checkBox4->isChecked()) 89 { 90 okButton->setEnabled(false); 91 } 92 else 93 { 94 okButton->setEnabled(true); 95 } 96 } 97 98 void NewDialog::submitInfo() 99 { 100 QString Info = "你提交的信息是:\n名字:" + edit->text() + 101 "\n爱好:"; 102 if(checkBox1->isChecked()) Info += checkBox1->text() +","; 103 if(checkBox2->isChecked()) Info += checkBox2->text() +","; 104 if(checkBox3->isChecked()) Info += checkBox3->text() +","; 105 if(checkBox4->isChecked()) Info += checkBox4->text() +","; 106 Info[Info.size() - 1] = '.'; 107 QMessageBox * msg = 108 new QMessageBox(QMessageBox::Information, 109 "提交成功", Info); 110 msg->show(); 111 emit infoSubmit(Info); 112 } 113 114 void NewDialog::cancelDlg() 115 { 116 QMessageBox * msg = 117 new QMessageBox(QMessageBox::Information, 118 "退出", "你已经放弃咯"); 119 msg->show(); 120 }
第3行:<QtGui>头文件
这个头文件包含了Qt GUI类的定义,包括QCheckBox、QLabel、QDialog等等这些类。
第5行:将parent传递给基类构造函数
第8行:设置编码格式
第16行:字符串中的"&o"
&后跟着的一个字母,这是在标识快捷键,按键盘ALT+这个字母即可快速定位焦点。
第17行:设置"提交"按钮无效
这可以将按钮变灰,无法使用。
第21行:设置标签的好友部件
用到的函数:void QLabel::setBuddy ( QWidget * buddy )
函数的说明:当键盘按下标签设置的快捷键时,将焦点定位到该好友上。
第30~43行:连接信号和槽
在这里槽的接收对象是this,也就是由自己这个类中指定的槽来执行相应的动作。
第72行:定义对话框的主布局管理器
将子布局对象添加到父布局对象中时,子布局对象就会自动重定义自己的父对象。当主布局装到对话框中去时,它就会成为对话框的子对象了,它的所有子窗口部件都会重定义自己的父对象,从而变成对话框中的子对象。
第81行:槽,设置"提交"按钮的有效性
这个函数用来检查名字是否有写,同时多选框至少选择一项。满足条件之后"提交"按钮将可以使用,否则变灰色无效。
第98行:槽,用于提示提交信息。
第107~109行:创建一个消息对话框
使用的函数:QMessageBox::QMessageBox ( Iconicon, const QString & title, const QString & text )
函数的说明:构造一个消息框,指定图标、标题和文本。除了这3个参数,后面还有一些带有默认值的参数,太多了,所以没写上。
第一个参数是指定显示图标,有以下图标
枚举值 |
值 |
说明 |
QMessageBox::NoIcon |
0 |
消息框没有任何图标 |
QMessageBox::Question |
4 |
消息框带有一个问号的图标 |
QMessageBox::Information |
1 |
消息框带有一个感叹号的图标 |
QMessageBox::Warning |
2 |
消息框带有一个三角形中有一个感叹号的图标 |
QMessageBox::Critical |
3 |
消息框带有一个X的图标 |
第二个参数是标题,第三个参数是文本内容。
创建这个消息框之后还需要show(),它才会显示。
第114行:槽,用于提示退出信息。
其它的估计也不需要多说明了,很简单的一个小程序。
主函数代码:
运行结果已经在上面说明了。
在类定义中,signals和public slots,这2个关键字实际上都是Qt的宏。
在写完所有信息之后,如果想要按回车来提交信息的话,可以在实例化"提交"按钮之后添加这一个函数:
okButton->setDefault(true);
设置按钮为默认按钮,使得当按下Enter时,自动按下该按钮。
如果想你改变对话框的大小的话,可以使用这两个函数:
setFixedHeight(200);
setFixedWidth(200);
这两个函数分别指定对话框的高和宽,因为类继承了QDialog,所以可以直接调用。
好咯,就到这里吧~
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 析构函数 2020-06-03
- C++ 枚举 2020-03-26
- Windows 创建 .gdbinit 提示必须键入文件名 2020-03-17
- 二叉树(二)线索二叉树 2020-02-01
- 二叉树(二)线索二叉树 2020-01-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash