【Qt】2.1 创建对话框

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设置了一个布局管理器,则不能再重复设置。只有先删除已有的布局管理器才能再次设置新的布局管理器。

显示效果

2016年07月12日 - Sky_天空 - 记录编程的点点滴滴

你会发现,中文显示成乱码了。

我百度了一下,然后这个文章说明了为何显示为乱码:http://blog.csdn.net/brave_heart_lxl/article/details/7186631

所以按照文章所说的,我只需要添加上这一句话即可。

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

写在setWindowTitle之前的位置就行了。另外可能编译时会出现QTextCodec找不到的问题,只需要加上头文件<QTextCodec>即可。

这就是创建的一个普通的对话框。

同时我们可以通过继承QDialog自己写一个对话框,实现自己的需要的功能。

就不把书上的代码搬上来了,我另外自己写一个。

点击提交之后,

如果点击放弃,

2016年07月12日 - Sky_天空 - 记录编程的点点滴滴

当然了这里没加入退出程序的代码~

新建一个类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 = "你提交的信息是:
名字:" + edit->text() +
101             "
爱好:";
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 

消息框带有一个感叹号的图标2016年07月12日 - Sky_天空 - 记录编程的点点滴滴

QMessageBox::Warning

2 

消息框带有一个三角形中有一个感叹号的图标

QMessageBox::Critical

3 

消息框带有一个X的图标

第二个参数是标题,第三个参数是文本内容。

创建这个消息框之后还需要show(),它才会显示。

第114行:槽,用于提示退出信息。

其它的估计也不需要多说明了,很简单的一个小程序。

主函数代码:

运行结果已经在上面说明了。

在类定义中,signals和public slots,这2个关键字实际上都是Qt的宏。

在写完所有信息之后,如果想要按回车来提交信息的话,可以在实例化"提交"按钮之后添加这一个函数:

okButton->setDefault(true);

设置按钮为默认按钮,使得当按下Enter时,自动按下该按钮。

如果想你改变对话框的大小的话,可以使用这两个函数:

setFixedHeight(200);

setFixedWidth(200);

这两个函数分别指定对话框的高和宽,因为类继承了QDialog,所以可以直接调用。

好咯,就到这里吧~

原文地址:https://www.cnblogs.com/recordprogram/p/5665232.html