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,所以可以直接调用。

    好咯,就到这里吧~

  • 相关阅读:
    PHP、JAVA、C#、Object-C 通用的DES加密
    xtraScrollableControl 滚动条随鼠标滚动
    C#让TopMost窗体弹出并置顶层但不获取当前输入焦点的终极办法
    C#获取“所有用户桌面”的路径
    C#如何获取快捷方式指向的目标文件
    10
    09
    新浪微博中tableview中头部信息
    ASIHTTPRequest类库简介和使用说明
    IOS常用设计模式之委托模式
  • 原文地址:https://www.cnblogs.com/recordprogram/p/5665232.html
Copyright © 2011-2022 走看看