QDialog是Qt对话框类,可以直接使用这个类来创建对象并显示出来。

要使用一个对话框,就这样子写:

 #include <QApplication>
#include <QDialog>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QPushButton> int mainc(int argc, char *argv[])
{
QApplication app(argc, argv); // 创建一个对话框对象
QDialog * dlg = new QDialog;
// 设置对话框标题文字
dlg->setWindowTitle("对话框"); // 创建一个编辑框和按钮
QLineEdit * edit = new QLineEdit;
QPushButton * button = new QPushButton("确定"); // 创建一个水平布局管理器并将编辑框和按钮添加进去
QHBoxLayout * layout = new QHBoxLayout;
layout->addWidget(edit);
layout->addWidget(button); // 设置对话框的布局管理器
dlg->setLayout(layout); // 显示对话框
dlg->show(); return app.exec();
}

第11行: 创建一个对话框对象

用到的函数:QDialog::QDialog ( QWidget * parent = 0, Qt::WindowFlagsf = 0 )

函数的说明:构造一个对话框。

第26行:设置对话框的布局管理器

用到的函数:void QWidget::setLayout ( QLayout * layout )

函数的说明:为指定的部件设置一个布局管理器。如果这个部件已经通过setLayout设置了一个布局管理器,则不能再重复设置。只有先删除已有的布局管理器才能再次设置新的布局管理器。

显示效果

你会发现,中文显示成乱码了。

我百度了一下,然后这个文章说明了为何显示为乱码:http://blog.csdn.net/brave_heart_lxl/article/details/7186631

所以按照文章所说的,我只需要添加上这一句话即可。

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

写在setWindowTitle之前的位置就行了。另外可能编译时会出现QTextCodec找不到的问题,只需要加上头文件<QTextCodec>即可。

这就是创建的一个普通的对话框。

同时我们可以通过继承QDialog自己写一个对话框,实现自己的需要的功能。

就不把书上的代码搬上来了,我另外自己写一个。

点击提交之后,

如果点击放弃,

当然了这里没加入退出程序的代码~

新建一个类NewDialog,头文件代码:

 #ifndef NEWDIALOG_H
#define NEWDIALOG_H #include <QDialog> class QLineEdit;
class QPushButton;
class QLabel;
class QCheckBox; class NewDialog : public QDialog
{
Q_OBJECT public:
NewDialog(QWidget * parent = ); signals:
void infoSubmit(const QString & info); public slots:
void setOkButtonEnable();
void submitInfo();
void cancelDlg(); private:
QLineEdit * edit;
QPushButton * okButton;
QPushButton * cancelButton;
QLabel * label_Name;
QLabel * label_Hobby;
QCheckBox * checkBox1;
QCheckBox * checkBox2;
QCheckBox * checkBox3;
QCheckBox * checkBox4; }; #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;这样的前置声明即可。

源文件代码:

 #include "newdialog.h"

 #include <QtGui>

 NewDialog::NewDialog(QWidget * parent) : QDialog(parent)
{
// 设置编码格式
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); // 设置对话框标题
setWindowTitle("个人信息"); // 新建对象
edit = new QLineEdit; okButton = new QPushButton("提交(&o)");
okButton->setEnabled(false);
cancelButton = new QPushButton("放弃(&c)"); label_Name = new QLabel("你的名字(&i)");
label_Name->setBuddy(edit);
label_Hobby = new QLabel("你的爱好"); checkBox1 = new QCheckBox("运动");
checkBox2 = new QCheckBox("电影");
checkBox3 = new QCheckBox("看书");
checkBox4 = new QCheckBox("游戏"); // 设置连接
connect(edit, SIGNAL(textChanged(QString)),
this, SLOT(setOkButtonEnable()));
connect(checkBox1, SIGNAL(clicked(bool)),
this, SLOT(setOkButtonEnable()));
connect(checkBox2, SIGNAL(clicked(bool)),
this, SLOT(setOkButtonEnable()));
connect(checkBox3, SIGNAL(clicked(bool)),
this, SLOT(setOkButtonEnable()));
connect(checkBox4, SIGNAL(clicked(bool)),
this, SLOT(setOkButtonEnable()));
connect(okButton, SIGNAL(clicked(bool)),
this, SLOT(submitInfo()));
connect(cancelButton, SIGNAL(clicked(bool)),
this, SLOT(cancelDlg())); // 设置布局 // 名字
QHBoxLayout * layoutName = new QHBoxLayout;
layoutName->addWidget(label_Name);
layoutName->addWidget(edit); // 爱好
QVBoxLayout * layoutHobby = new QVBoxLayout;
layoutHobby->addWidget(label_Hobby); QGridLayout * layoutCheckBox = new QGridLayout;
layoutCheckBox->addWidget(checkBox1, , );
layoutCheckBox->addWidget(checkBox2, , );
layoutCheckBox->addWidget(checkBox3, , );
layoutCheckBox->addWidget(checkBox4, , ); layoutHobby->addLayout(layoutCheckBox); // 提交与放弃按钮
QHBoxLayout * layoutButton = new QHBoxLayout;
layoutButton->addStretch();
layoutButton->addWidget(okButton);
layoutButton->addWidget(cancelButton); // 主布局管理器
QVBoxLayout * mainLayout = new QVBoxLayout;
mainLayout->addLayout(layoutName);
mainLayout->addLayout(layoutHobby);
mainLayout->addLayout(layoutButton); setLayout(mainLayout); } void NewDialog::setOkButtonEnable()
{
if(edit->text() == "")
{
okButton->setEnabled(false);
}
else if(!checkBox1->isChecked() && !checkBox2->isChecked() &&
!checkBox3->isChecked() && !checkBox4->isChecked())
{
okButton->setEnabled(false);
}
else
{
okButton->setEnabled(true);
}
} void NewDialog::submitInfo()
{
QString Info = "你提交的信息是:\n名字:" + edit->text() +
"\n爱好:";
if(checkBox1->isChecked()) Info += checkBox1->text() +",";
if(checkBox2->isChecked()) Info += checkBox2->text() +",";
if(checkBox3->isChecked()) Info += checkBox3->text() +",";
if(checkBox4->isChecked()) Info += checkBox4->text() +",";
Info[Info.size() - ] = '.';
QMessageBox * msg =
new QMessageBox(QMessageBox::Information,
"提交成功", Info);
msg->show();
emit infoSubmit(Info);
} void NewDialog::cancelDlg()
{
QMessageBox * msg =
new QMessageBox(QMessageBox::Information,
"退出", "你已经放弃咯");
msg->show();
}

第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

消息框带有一个感叹号的图标

QMessageBox::Warning

2

消息框带有一个三角形中有一个感叹号的图标

QMessageBox::Critical

3

消息框带有一个X的图标

第二个参数是标题,第三个参数是文本内容。

创建这个消息框之后还需要show(),它才会显示。

第114行:槽,用于提示退出信息。

其它的估计也不需要多说明了,很简单的一个小程序。

主函数代码:

运行结果已经在上面说明了。

在类定义中,signals和public slots,这2个关键字实际上都是Qt的宏。

在写完所有信息之后,如果想要按回车来提交信息的话,可以在实例化"提交"按钮之后添加这一个函数:

okButton->setDefault(true);

设置按钮为默认按钮,使得当按下Enter时,自动按下该按钮。

如果想你改变对话框的大小的话,可以使用这两个函数:

setFixedHeight(200);

setFixedWidth(200);

这两个函数分别指定对话框的高和宽,因为类继承了QDialog,所以可以直接调用。

好咯,就到这里吧~

【Qt】2.1 创建对话框的更多相关文章

  1. 【Qt】2.3 使用Qt设计师来创建对话框

    安装完Qt OpenSource之后,在开始菜单目录下会有这几个东西. 其中[Designer]是用来设计窗口界面的程序.所以现在可以使用它来设计一个对话框.在[Qt Creator]中,[设计]这一 ...

  2. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  3. Android 官方推荐 : DialogFragment 创建对话框

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37815413 1. 概述 DialogFragment在android 3.0时 ...

  4. [Android Pro] Android 官方推荐 : DialogFragment 创建对话框

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37815413 1. 概述 DialogFragment在android 3.0时 ...

  5. MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDIT ...

  6. [ucgui] 对话框1——创建对话框

    >_<" 小工具和对话框的区别: 小工具可以创建并独立使用,因为它们本质上就是窗口.但是,通常需要使用对话框,它是包含一个或多个小工具的窗口. 对话框通常是一个窗口,它在出现时会 ...

  7. MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)

    本节开始为大家讲解偏向应用的知识--创建对话框.  对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是对话框,知识它做了很多美工方面的工作,将其大大美 ...

  8. Android控件大全(一)——DialogFragment创建对话框

    DialogFragment在android 3.0时被引入.是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框.典型的用于:展示警告框,输入框,确认框等等. 在Dia ...

  9. 【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下, ...

  10. Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法

    详细说明:Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法.该方法可以在运行时在内存中直接建立对话框资源,使用起来更为灵活.适用于多个开发项目共享有界面的公用程序模 ...

随机推荐

  1. 51nod 1011 【完全背包】

    完全背包的变形: 这些数字可以取多次,dp[i]代表前 i 物品组成N时的方案数. #include<iostream> #include<cstring> #include& ...

  2. C++内存泄漏检测

    CRT检测 定位内存泄漏位置 #include "stdafx.h" #ifdef _DEBUG #define DEBUG_NEW new( _NORMAL_BLOCK, __F ...

  3. 搭建 CDH 版本hive

    搭建一个完整的cdh 的版本,由于涉及的产品和步骤太多,在客户那里部署环境时,很容易出现意外,所以如果只是需要部署一个测试环境来进行验证,我们没有必要完完整整的部署整个cdh.   下面是通过命令行的 ...

  4. Maven - settings.xml简易配置Demo

    前言 这里贴一下settings.xml的一个简易配置demo,就是简单配置了:本地的仓库地址.阿里云镜像.指定使用jdk1.8进行编译. 这里使用的Maven是3.5.0版本的. 配置文件demo ...

  5. NET4.5中的Task.Run及Task.Delay方法

  6. 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传

    一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...

  7. Codeforces Round #546 (Div. 2) A. Nastya Is Reading a Book

    链接:https://codeforces.com/contest/1136/problem/A 题意: 给n个区间,每个区间范围不超过100,n不超过100. 给一个位置k,1-(k-1)是遍历过的 ...

  8. HDU4089(概率dp)

    题解 要点: 1.转移方程分三段,这个……有点复杂但是还好吧……大概就是求啥设啥,然后只通过可行的状态过来.在纸上记一记. 2.每层里面必须先求dp[i][i],简直就是我求我自己……用类似进制数那种 ...

  9. 洛谷P2470||bzoj1068 [SCOI2007]压缩

    bzoj1068 洛谷P2470 区间dp入门题?只要注意到每个M“管辖”的区间互不相交即可 错误记录:有点小坑,比如aaaacaaaac最优解为aRRcR(意会坑在哪里),踩了一次 #include ...

  10. 项目用Git上传到coding

    关于这样的东西,网上很多教程,这里就结合自己看的还有自己的例子来说明一下吧: 1.你得下载一个git软件并成功安装 2.生成ssh: 关于这个,我觉得似乎不是一定的,因为通过https也可以连接到co ...