QDialog的父类及其若干子类
QAbstractPrintDialog 提供打印机配置对话框的基本实现对话框
QColorDialog 提供指定窗体颜色的对话框
QErrorMessage 提供“错误提示”对话框
QFileDialog 提供选择文件或目录的对话框
QFontDialog 提供指定窗体的文字字体对话框
QInputDialog 提供标准输入对话框,可以方便的输入各种值
QMessageBox 提供一个模态对话框用于提示用户信息或要求用户回答问题
QPageSetupDialog 提供一个用于打印机页面设置的对话框
QPrintPreviewDialog 提供一个预览和调整打印机页面布局的对话框
QProgressDialog 提供一个长进程操作的进度回馈对话框
QWizard 提供一个“向导程序”的框架
创建一个QDialog工程(编译器:Qt Creater)
新建一个工程:
打开编译器,点击“文件”,选择“新建文件或工程” 出现下面的图,并按红色标记处选择
填写项目名称、选择路径,完成后点击“下一步”
默认选项
填写类名,特别注意的是,因为我们这儿创建的是一个QDialog,所以,基类名一定要选择QDialog
工程创建完成,下面就是完整的源代码
/* logindlg.h */
#ifndef LOGINDLG_H
#define LOGINDLG_H
// 定义宏变量,确保该头文件只被包含一次,防止头文件多次包含
#include
/*
* 在编译头文件时,gcc不需要知道QLineEdit类的定义,故不需要包含头文件,仅仅一个声明就行。
* 这样做的好处由两个:
* 首先,它减小了头文件的大小,增加编译的速度
* 其次,避免了包含头文件的顺序不当造成链接错误
*/
class QLineEdit;
namespace Ui {
class LoginDlg;
}
class LoginDlg : public QDialog
{
// 启动Qt元对象系统的一些特性(比如支持信号和槽等),它必须放置到类定义的私有区
Q_OBJECT
public:
// 构造函数,它指定了一个默认值为NULL的指向QWidget的参数
// 该行参定义了对话框对象的父窗口部件,默认NULL意味着自定义的对话框没有父窗口部件
explicit LoginDlg(QWidget *parent = 0);
~LoginDlg();
public slots:
// 虚函数,能重写
virtual void accept();
private:
Ui::LoginDlg *ui;
QLineEdit *usrLineEdit; // 存放、显示输入用户名
QLineEdit *pwdLineEdit; // 存放、显示用户输入的密码
};
#endif // LOGINDLG_H
---------------------------------------------分隔符------------------------------------------------------------------
/* logindlg.cpp */
#include
#include "logindlg.h"
#include "ui_logindlg.h"
// 调用LoginDlg的父类的构造函数QDialog,并将实参传递给了父类的构造函数,以设置对话框的父部件
LoginDlg::LoginDlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::LoginDlg)
{
ui->setupUi(this);
// QLabel标签
QLabel *usrLabel = new QLabel(tr("用户名:"));
QLabel *pwdLabel = new QLabel(tr("密 码:"));
// QLineEdit行编辑框
usrLineEdit = new QLineEdit;
pwdLineEdit = new QLineEdit;
/*
* QLineEdit::Password设置了行编辑框中显示信息的方式为“*”,还有其它方式如下:
* QLineEdit::Normal,默认的显示方式,显示用户实际的输入内容
* QLineEdit::Pasword,用“*”代替用户实际输入的内容
* QLineEdit::NoEcho,不显示用户输入的任何信息
* QLineEdit::PasswordEchoOnEdit,仅仅用户在行编辑框里编辑就文本的内容时才显示内容,完成后用“*”代替
*/
pwdLineEdit->setEchoMode(QLineEdit::Password);
QGridLayout *gridLayout = new QGridLayout;
// 前面两个表示了行和列的位置,后面两个参数表示了行和列的跨度
gridLayout->addWidget(usrLabel, 0, 0, 1, 1);
gridLayout->addWidget(usrLineEdit, 0, 1, 1, 3);
gridLayout->addWidget(pwdLabel, 1, 0, 1, 1);
gridLayout->addWidget(pwdLineEdit, 1, 1, 1, 3);
QPushButton *okBtn = new QPushButton(tr("确定"));
QPushButton *cancelBtn = new QPushButton(tr("取消"));
// 水平布局,默认将下面两个按钮按从左向右的顺序排布
QHBoxLayout *btnLayout = new QHBoxLayout;
// btnLayout对象内部窗口之间的间隔是60
btnLayout->setSpacing(60);
btnLayout->addWidget(okBtn);
btnLayout->addWidget(cancelBtn);
// 垂直布局
QVBoxLayout *dlgLayout = new QVBoxLayout;
// 设置边框的宽度是40
dlgLayout->setMargin(40);
dlgLayout->addLayout(gridLayout);
// 使gridLayout和btnLayout之间的默认距离设置成40,同时当上下拉伸对话框的高度时,
// 该stretch可以自由伸缩,从而保证gridLayout和btnLayout管理内部各窗口部件的高度
// 以及彼此间的距离不变
dlgLayout->addStretch(40);
dlgLayout->addLayout(btnLayout);
setLayout(dlgLayout);
connect(okBtn, SIGNAL(clicked()), this, SLOT(accept()));
connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
// 设置对话框的标题
setWindowTitle(tr("登录"));
resize(300, 200);
}
void LoginDlg::accept()
{
// QLineEdit::text()返回行编辑框中的文本内容,返回类型是一个QString类型
// QString.trimmed()移除在字符串开头和结尾的空白字符串,并返回移除空白字符后的字符串
if(usrLineEdit->text().trimmed() == tr("lcf")
&& pwdLineEdit->text() == tr("lcf"))
{
QDialog::accept();
}
else
{
// 创建并显示一个模态的警告对话框
QMessageBox::warning(this,
tr("警告"),
tr("用户名或密码错误!"),
QMessageBox::Yes);
// 将鼠标的焦点定位到行编辑框对象usrLineEdit
usrLineEdit->setFocus();
}
}
LoginDlg::~LoginDlg()
{
delete ui;
}
---------------------------------------------分隔符------------------------------------------------------------------
/* main.cpp */
#include
#include "logindlg.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 设置中文显示
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
LoginDlg dlg;
/*
* 对话框分为了模态对话框和非模态对话框
* 模态对话框,QDialog::exec(),对话框没有消失之前,用户不能和同一进程的其它窗口进行交互,直到对话框关闭
* 非模态对话框,QDialog::show(),默认方式,用户可以和同一进程中的其它窗口交互。
*/
//dlg.show();
return dlg.exec();
}
运行结果:
我用的ubuntu12.04在调试的过程中,遇到的就是问题就是“中文不能显示”
后来看了这篇文章 http://blog.csdn.net/lincyang/article/details/5758287,经过修改,调试成功
具体的步骤:
1、打开终端,输入echo $LANG
zh_CN.UTF-8
2、在main.cpp中添加语句
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));