5.4 标准输入对话框:QInputDialog类
标准输入对话框提供4种数据类型的输入:字符串、int类型数据、double类型数据和下拉列表框的条目。下面的例子演示了各种标准输入框的使用,首先是完成界面的设计。具体操作步骤如下:
(1) 在“DialogExample”项目名上单击鼠标右键,在弹出的快捷菜单中选择“Add New...”菜单项,在弹出的对话框中选择“C++ Class”选项,单击“OK”按钮,弹出“C++Class Wizard”对话框,在Base class后面的下拉列表框中输入基类名“QDialog”, 在Class name后面的文本框中输入类的名称“InputDlg”。
(2) 单击“Next”按钮,单击“Finish”按钮,在该工程中就添加了inputdlg.h头文件和inputdlg.cpp源文件。
(3) 打开“inputdlg.h”头文件,完成所需要的各种控件和完成功能的槽函数的声明。具体代码如下:
//添加的头文件 #include <QLabel> #include <QPushButton> #include <QGridLayout> class InputDlg : public QDialog { Q_OBJECT public: InputDlg(QWidget* parent=0); private slots: void ChangeName(); void ChangeSex(); void ChangeAge(); void ChangeScore(); private: QLabel *nameLabel1; QLabel *sexLabel1; QLabel *ageLabel1; QLabel *scoreLabel1; QLabel *nameLabel2; QLabel *sexLabel2; QLabel *ageLabel2; QLabel *scoreLabel2; QPushButton *nameBtn; QPushButton *sexBtn; QPushButton *ageBtn; QPushButton *scoreBtn; QGridLayout *mainLayout; };
(4) 打开“inputdlg.cpp”文件,完成所需要的各种控件的创建和完成槽函数的实现。具体代码如下:
InputDlg::InputDlg(QWidget* parent) :QDialog(parent) { setWindowTitle(tr("标准输入对话框的实例")); nameLabel1 =new QLabel; nameLabel1->setText(tr("姓名:")); nameLabel2 =new QLabel; nameLabel2->setText(tr("张三")); //姓名的初始值 nameLabel2->setFrameStyle(QFrame::Panel|QFrame::Sunken); nameBtn =new QPushButton; nameBtn->setText(tr("修改姓名")); sexLabel1 =new QLabel; sexLabel1->setText(tr("性别:")); sexLabel2 =new QLabel; sexLabel2->setText(tr("男")); //性别的初始值 sexLabel2->setFrameStyle(QFrame::Panel|QFrame::Sunken); sexBtn =new QPushButton; sexBtn->setText(tr("修改性别")); ageLabel1 =new QLabel; ageLabel1->setText(tr("年龄:")); ageLabel2 =new QLabel; ageLabel2->setText(tr("21")); //年龄的初始值 ageLabel2->setFrameStyle(QFrame::Panel|QFrame::Sunken); ageBtn =new QPushButton; ageBtn->setText(tr("修改年龄")); scoreLabel1 =new QLabel; scoreLabel1->setText(tr("成绩:")); scoreLabel2 =new QLabel; scoreLabel2->setText(tr("80")); //成绩的初始值 scoreLabel2->setFrameStyle(QFrame::Panel|QFrame::Sunken); scoreBtn =new QPushButton; scoreBtn->setText(tr("修改成绩")); mainLayout =new QGridLayout(this); mainLayout->addWidget(nameLabel1,0,0); mainLayout->addWidget(nameLabel2,0,1); mainLayout->addWidget(nameBtn,0,2); mainLayout->addWidget(sexLabel1,1,0); mainLayout->addWidget(sexLabel2,1,1); mainLayout->addWidget(sexBtn,1,2); mainLayout->addWidget(ageLabel1,2,0); mainLayout->addWidget(ageLabel2,2,1); mainLayout->addWidget(ageBtn,2,2); mainLayout->addWidget(scoreLabel1,3,0); mainLayout->addWidget(scoreLabel2,3,1); mainLayout->addWidget(scoreBtn,3,2); mainLayout->setMargin(15); mainLayout->setSpacing(10); connect(nameBtn,SIGNAL(clicked()),this,SLOT(ChangeName())); connect(sexBtn,SIGNAL(clicked()),this,SLOT(ChangeSex())); connect(ageBtn,SIGNAL(clicked()),this,SLOT(ChangeAge())); connect(scoreBtn,SIGNAL(clicked()),this,SLOT(ChangeScore())); } void InputDlg::ChangeName() { } void InputDlg::ChangeSex() { } void InputDlg::ChangeAge() { } void InputDlg::ChangeScore() { }
完成主对话框的操作过程如下:
(1) 在dialog.h中,添加头文件:
#include "inputdlg.h"。
添加private成员变量如下:
QPushButton *inputBtn;
添加实现标准输入对话框实例的InputDlg类:
InputDlg *inputDlg;
(2) 添加private slots槽函数:
void showInputDlg();
(3) 在dialog.cpp中,构造函数中的代码如下:
inputBtn =new QPushButton; //创建控件的对象 inputBtn->setText(tr("标准输入对话框实例"));
添加布局管理:
mainLayout->addWidget(inputBtn,3,0); //布局设计
最后添加事件关联:
connect(inputBtn,SIGNAL(clicked()),this,SLOT(showInputDlg())); //事件关联
其中,槽函数showInputDlg()的实现代码如下:
void Dialog::showInputDlg() { inputDlg =new InputDlg(this); inputDlg->show(); }
(4) 运行该程序后,单击“标准输入对话框实例”按钮后显示如图5.5所示。
5.4.1 标准字符串输入对话框
标准字符串输入对话框是通过QInputDialog类的静态函数getText()来完成的, getText()函数形式如下:
QString getText ( QWidget* parent, //标准输入对话框的父窗口 const QString& title, //标准输入对话框的标题名 const QString& label, //标准输入对话框的标签提示 QLineEdit::EchoMode mode=QLineEdit::Normal, //指定标准输入对话框中QLineEdit控件的输入模式 const QString& text=QString(), //标准字符串输入对话框弹出时QLineEdit控件 中默认出现的文字 bool* ok=0, //注 Qt::WindowFlags flags=0 //指明标准输入对话框的窗体标识 );
注:指示标准输入对话框的哪个按钮被触发,若为true,则表示用户单击了“OK”(确定)按钮,若为false,则表示用户单击了“Cancle”(取消)按钮。
接着上述的程序,完成inputdlg.cpp文件中的槽函数ChangeName()的实现。具体代码如下:
void InputDlg::ChangeName() { bool ok; QString text=QInputDialog::getText(this,tr("标准字符串输入对话框"),tr(" 请输入姓名:"), QLineEdit::Normal,nameLabel2->text(),&ok); if (ok && !text.isEmpty()) nameLabel2->setText(text); }
在inputdlg.cpp文件的开头添加头文件:
#include<QInputDialog>
再次运行程序,单击“修改姓名”按钮后出现对话框,可在内修改姓名,如图5.5(b)所示。
5.4.2 标准条目选择对话框
标准条目选择对话框是通过QInputDialog类的静态函数getItem()函数完成, getItem()函数形式如下:
QString getItem ( QWidget* parent, //标准输入对话框的父窗口 const QString& title, //标准输入对话框的标题名 const QString& label, //标准输入对话框的标签提示 const QStringList& items, //注(1) int current=0, //注(2) bool editable=true, //指定QComboBox控件中显示的文字是否可编辑 bool* ok=0, //注(3) Qt::WindowFlags flags=0 //指明标准输入对话框的窗口标识 );
注1.指定标准输入对话框中QComboBox控件显示的可选条目为一个QStringList对象。
2.标准条目选择对话框弹出时QComboBox控件中默认显示的条目序号。
3.指示标准输入对话框的哪个按钮被触发,若ok为true,则表示用户单击了“OK”(确定)按钮,若ok为false,则表示用户单击了“Cancle”(取消)按钮。
同上,接着上述的程序,完成inputdlg.cpp文件中的槽函数ChangeSex()的实现。具体代码如下:
void InputDlg::ChangeSex() { QStringList SexItems; SexItems << tr("男") << tr("女"); bool ok; QString SexItem = QInputDialog::getItem(this, tr("标准条目选择对话框"), tr("请选择性别:"), SexItems, 0, false, &ok); if (ok && !SexItem.isEmpty()) sexLabel2->setText(SexItem); }
再次运行程序,单击“修改性别”按钮后出现对话框,可在内选择性别,如图5.5(c)所示。
5.4.3 标准int类型输入对话框
标准int类型输入对话框通过QInputDialog类的静态函数getInt()函数完成,getInt()函数形式如下:
int getInt ( QWidget* parent, //标准输入对话框的父窗口 const QString& title, //标准输入对话框的标题名 const QString& label, //标准输入对话框的标签提示 int value=0, //指定标准输入对话框中QSpinBox控件默认显示值 int min=-2147483647, //指定QSpinBox控件的数值范围 int max=2147483647, int step=1, //指定QSpinBox控件的步进值 bool* ok=0, //注 Qt::WindowFlags flags=0 //指明标准输入对话框的窗口标识 );
注:用于指示标准输入对话框的哪个按钮被触发。若ok为true,则表示用户单击了“OK”(确定)按钮;若ok为false,则表示用户单击了“Cancel”(取消)按钮。
同上,接着上述的程序,完成inputdlg.cpp文件中的槽函数ChangeAge()的实现。具体代码如下:
void InputDlg::ChangeAge() { bool ok; int age = QInputDialog::getInt(this, tr("标准int类型输入对话框"), tr("请输入年龄:"), ageLabel2->text().toInt(&ok), 0, 100, 1, &ok); if (ok) ageLabel2->setText(QString(tr("%1")).arg(age)); }
再次运行程序,单击“修改年龄”按钮后出现对话框,可在内修改年龄,如图5.5(d)所示。
5.4.4 标准double类型输入对话框
标准double类型输入对话框通过QInputDialog类的静态函数getDouble()函数完成, getDouble()函数形式如下:
double getDouble ( QWidget* parent, //标准输入对话框的父窗口 const QString& title, //标准输入对话框的标题名 const QString& label, //标准输入对话框的标签提示 double value=0, //指定标准输入对话框中QSpinBox控件默认显示值 double min=-2147483647, //指定QSpinBox控件的数值范围 double max=2147483647, int decimals=1, //指定QSpinBox控件的步进值 bool* ok=0, //注 Qt::WindowFlags flags=0 //指明标准输入对话框的窗口标识 );
注:用于指示标准输入对话框的哪个按钮被触发,若ok为true,则表示用户单击了“OK”(确定)按钮,若ok为false,则表示用户单击了“Cancel”(取消)按钮。
同上,接着上述的程序,完成inputdlg.cpp文件中槽函数ChangeScore()的实现。具体代码如下:
void InputDlg::ChangeScore() { bool ok; double score = QInputDialog::getDouble(this, tr("标准 double 类型输入对 话框"),tr("请输入成绩:"),scoreLabel2->text().toDouble(&ok), 0, 100, 1, &ok); if (ok) scoreLabel2->setText(QString(tr("%1")).arg(score)); }
再次运行程序,单击“修改成绩”按钮后出现对话框,可在内修改成绩,如图5.5(e)所示。