Qt 4开发实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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)所示。