Qt中使用标准输入框

这一节主要讲一下标准输入框的使用,Qt提供了一个QInputDialog类,这个类提供了几个预先设定好的常用输入对话框。
比如:

  • 需要输入文本的时候,他将QlineEdit的一系列控件封装到QInputDialog::getText()中;
  • 需要输入选择条目的时候,他将QComboBox的一系列控件封装到QInputDialog::getItem()中;
  • 需要输入数值的时候,他将QSpinbox的一系列控件封装到QInputDialog::getInt()或QInputDialog::getDouble()中。

以下依旧是用程序来说明:

Dialog.pro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#-------------------------------------------------
#
# Project created by QtCreator 2015-10-24T17:32:35
#
#-------------------------------------------------

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Dialog
TEMPLATE = app

SOURCES += main.cpp
dialog.cpp

HEADERS += dialog.h

dialog.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<QGridLayout>
#include<QPushButton>
#include<QLabel>
#include<QInputDialog>
class Dialog : public QDialog
{
Q_OBJECT

public:
Dialog(QWidget *parent = 0);
~Dialog();
public:
QGridLayout *layout;
QPushButton *nameButton,*sexButton,*ageButton,*statureButton;
QLabel *label1,*label2,*label3,*label4,*nameLabel,*sexLabel,*ageLabel,*statureLabel;
private slots:
//设置按钮单击信号的槽
void slotName();
void slotSex();
void slotAge();
void slotStature();
};

#endif // DIALOG_H

dialog.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include "dialog.h"

Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("Input Dialog");
label1=new QLabel("姓名:");
label2=new QLabel("性别:");
label3=new QLabel("年龄:");
label4=new QLabel("身高:");

//创建显示标签,用于显示已选择的信息。
nameLabel=new QLabel("LiMing");
/**

以下调用了QLabel的setFrameStyle()方法,设置QLabel的样式,这里有两个枚举类型--QFrame::Shape和QFrame::Shadow

QFrame::Shape定义了QFrame的框架所使用的外形。当前定义的效果有:

QFrame::NoFrame 不画任何东西
QFrame::Box 在它的内容周围画一个框
QFrame::Panel 画一个平板使内容看起来凸起或者凹陷
QFrame::WinPanel 像Panel,但QFrame绘制三维效果的方式和Microsoft Windows 95(及其它)的一样
QFrame::ToolBarPanel 调用QStyle::drawToolBarPanel()
QFrame::MenuBarPanel 调用QStyle::drawMenuBarPanel()
QFrame::HLine 绘制一个水平线,但没有框任何东西(作为分隔是有用的)
QFrame::VLine 绘制一个竖直线,但没有框任何东西(作为分隔是有用的)
QFrame::StyledPanel 调用QStyle::drawPanel()
QFrame::PopupPanel 调用QStyle::drawPopupPanel()

QFrame::Shadow这个枚举类型定义了QFrame的框架所使用的外形。当前定义的效果有:

QFrame::Plain 框架和内容看来和周围一样高
QFrame::Raised 框架和内容看起来凸起
QFrame::Sunken 框架和内容看起来凹陷
QFrame::MShadow 内部的,对于阴影的掩码

*/

nameLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);//这里设置了凹陷的效果
sexLabel=new QLabel("man");
sexLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);
ageLabel=new QLabel("20");
ageLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);
statureLabel=new QLabel("178");
statureLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);

nameButton=new QPushButton;
nameButton->setText("...");
sexButton=new QPushButton;
sexButton->setText("...");
ageButton=new QPushButton;
ageButton->setText("...");
statureButton=new QPushButton;
statureButton->setText("...");

layout=new QGridLayout(this);
layout->addWidget(label1,0,0);
layout->addWidget(nameLabel,0,1);
layout->addWidget(nameButton,0,2);
layout->addWidget(label2,1,0);
layout->addWidget(sexLabel,1,1);
layout->addWidget(sexButton,1,2);
layout->addWidget(label3,2,0);
layout->addWidget(ageLabel,2,1);
layout->addWidget(ageButton,2,2);
layout->addWidget(label4,3,0);
layout->addWidget(statureLabel,3,1);
layout->addWidget(statureButton,3,2);

//设置各个Grid列的相对比例,这里是1:4:2
layout->setColumnStretch(0,1);
layout->setColumnStretch(1,4);
layout->setColumnStretch(2,1);

layout->setMargin(10);
//设置窗口的固定大小
this->setFixedSize(300,120);

connect(nameButton,SIGNAL(clicked()),this,SLOT(slotName()));
connect(sexButton,SIGNAL(clicked()),this,SLOT(slotSex()));
connect(ageButton,SIGNAL(clicked()),this,SLOT(slotAge()));
connect(statureButton,SIGNAL(clicked()),this,SLOT(slotStature()));
}

Dialog::~Dialog()
{

}

void Dialog::slotName(){
bool ok;

/*
static QString QInputDialog::getText ( QWidget * parent,const QString & title,const QString &label, QLineEdit::EchoMode mode = QLineEdit::Normal,const QString & text = QString(), bool * ok = 0, Qt::WindowFlags flags = 0 );

第一个参数parent,也就是那个熟悉的父组件的指针;
第二个参数title就是对话框的标题;
第三个参数label是在输入框上面的提示语句;
第四个参数mode用于指明这个QLineEdit的输入模式,取值范围是QLineEdit::EchoMode,默认是Normal,也就是正常显示,你也可以声明为password,这样就是密码的输入显示了;
第五个参数text是QLineEdit的默认字符串;
第六个参数 ok是可选的,如果非NLL,则当用户按下对话框的OK按钮时,这个bool变量会被置为true,可以由这个去判断用户是按下的OK还是Cancel,从而获知这个text是不是有意义;
第七个参数flags用于指定对话框的样式。
*/

QString name=QInputDialog::getText(this,"Username","Please input the name:",QLineEdit::Normal,nameLabel->text(),&ok);
if(ok&&!name.isEmpty()){
nameLabel->setText(name);
}
}

void Dialog::slotSex(){
QStringList list;
list<<"male"<<"female";//给QStringList 赋值
bool ok;

/*
static QString QInputDialog::getText ( QWidget * parent,const QString & title,const QString &label, const QStringList &list,int current=0,bool editable=true, bool * ok = 0, Qt::WindowFlags flags = 0 );

第一个参数parent,也就是那个熟悉的父组件的指针;
第二个参数title就是对话框的标题;
第三个参数label是在输入框上面的提示语句;
第四个参数QStringList用于指定需要显示的条目是一个QStringList 对象,
第五个参数current是QStringList 中默认的条目的下标;
第六个参数editable是设置文字是否可以编辑
第七个参数 ok是可选的,如果非NLL,则当用户按下对话框的OK按钮时,这个bool变量会被置为true,可以由这个去判断用户是按下的OK还是Cancel,从而获知这个text是不是有意义;
第八个参数flags用于指定对话框的样式。
*/
QString sex=QInputDialog::getItem(this,"Sex","Please choose the sex",list,0,false,&ok);
if(ok){
sexLabel->setText(sex);
}
}

void Dialog::slotAge(){
bool ok;
/*
static QString QInputDialog::getText ( QWidget * parent,const QString & title,const QString &label, int value ,int minValue=-2147483647, int maxValue = 2147483647, int step=1, bool * ok = 0, Qt::WindowFlags flags = 0 );

第一个参数parent,也就是那个熟悉的父组件的指针
第二个参数title就是对话框的标题
第三个参数label是在输入框上面的提示语句
第四个参数value表示默认值
第五个参数minValue表示最小值
第六个参数maxValue表示最大值
第七个参数step表示各个选项的间隔
第八个参数ok是可选的,如果非NLL,则当用户按下对话框的OK按钮时,这个bool变量会被置为true,可以由这个去判断用户是按下的OK还是Cancel,从而获知这个text是不是有意义;
第九个参数flags用于指定对话框的样式。
*/

int age=QInputDialog::getInt(this,"User age","Please input the age",ageLabel->text().toInt(),0,150,1,&ok);
if(ok){
ageLabel->setText(QString().setNum(age));//将数字变成文本
}
}

void Dialog::slotStature(){
bool ok;

//QInputDialog::getDouble使用方法如getInt
double stature=QInputDialog::getDouble(this,"User stature","Please input the stature",statureLabel->text().toDouble(),0,240.00,1,&ok);//这里文本变成double要进行转换
if(ok){
statureLabel->setText(QString().setNum(stature));
}
}

main.cpp

1
2
3
4
5
6
7
8
9
10
11
#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();

return a.exec();
}

运行截图