zoukankan      html  css  js  c++  java
  • 【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,所以可以直接调用。

    好咯,就到这里吧~

  • 相关阅读:
    Python 爬虫js加密破解(一) 爬取今日头条as cp 算法 解密
    Python 爬虫实例(2)—— 爬取今日头条
    Python 爬虫实例(1)—— 爬取百度图片
    python 操作redis之——HyperLogLog (八)
    python 操作redis之——有序集合(sorted set) (七)
    Python操作redis系列之 列表(list) (五)
    Python操作redis系列以 哈希(Hash)命令详解(四)
    Python操作redis字符串(String)详解 (三)
    How to Install MySQL on CentOS 7
    Linux SSH远程文件/目录 传输
  • 原文地址:https://www.cnblogs.com/recordprogram/p/5665232.html
Copyright © 2011-2022 走看看