对话框 QDialog

来源:互联网 发布:花生壳 80端口 编辑:程序博客网 时间:2024/05/17 02:41

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 <QDialog>
/*
 * 在编译头文件时,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 <QtGui/QtGui>
#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 <QtGui/QtGui>
#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"));









原创粉丝点击