学习笔记之Qt4内建对话框

为了方便程序员进行某些特定功能对话框的编程,Qt提供了一套标准的通用对话框。这些内建的对话框都提供了一些便于使用的静态函数。在windows系统上,这些静态函数将会调用本地的windows对话框;而在Mac OS X系统下,这些静态函数将会调用本地的Mac OS X对话框。
    Qt提供的内建对话框有:
1、颜色对话框QColorDialog,能够允许用户选择颜色;
2、错误消息框QErrorMessage,显示错误信息;
3、文件对话框QFileDialog,能够允许用户选择一个或多个文件以及目录;
4、字体对话框QFontDialog,允许用户选择/设置字体;
5、输入对话框QInputDialog,允许用户进行简单的输入,比如输入一行文本或者一个数字等;
6、页设计对话框QPageSetupDialog,配置与页相关的打印机选项;
7、进度对话框QProgressDialog,指示一个长时间操作的工作进度,以及用户该操作是否已经停滞;
8、打印对话框QPrintDialog,配置打印机。可以允许用户选择可用的打印机,以及允许用户设置文档相关的设置(例如,纸张大小以及方向等),打印类型(彩色打印或黑白打印)、页码范围和打印的份数等;
9、QMessageBox消息框。

使用内建对话框实例:
1、用qt creator创建一个名为builtin的empty qt project工程;
2、在工程中添加builtindlg.h,builtindlg.cpp,builtin.cpp文件,代码如下:

builtindlg.h

#ifndef BUILTINDLG_H
#define BUILTINDLG_H
#include<QtGui/QDialog>
#include<QtGui/QGridLayout>
class QTextEdit;
class QPushButton;
class CBuiltinDlg:public QDialog
{
    Q_OBJECT
public:
    CBuiltinDlg(QWidget *parent=0);
    virtual ~CBuiltinDlg(){}
private:
    QTextEdit* displayTextEdit;
    QPushButton* colorPushBtn;
    QPushButton* errorPushBtn;
    QPushButton* filePushBtn;
    QPushButton* fontPushBtn;
    QPushButton* inputPushBtn;
    QPushButton* pagePushBtn;
    QPushButton* progressPushBtn;
    QPushButton* printPushBtn;
    QPushButton* btn;
    QGridLayout* gridLayout;
private slots:
    void doPushBtn();
};

#endif // BUILTINDLG_H


builtindlg.cpp

#include<QtGui/QtGui>
#include"builtindlg.h"

CBuiltinDlg::CBuiltinDlg(QWidget* parent):QDialog(parent)
{
    // 创建一个显示内容为“Qt的标准通用对话框。”的文本编辑框QTextEdit对象
    displayTextEdit=new QTextEdit(tr("Qt的标准通用对话框。"));

    //创建一个网格布局管理器gridLayout对象,然后将各个按钮对象添加到该布局管理器中
    gridLayout=new QGridLayout;
    colorPushBtn=new QPushButton(tr("颜色对话框"));
    errorPushBtn=new QPushButton(tr("错误消息框"));
    filePushBtn=new QPushButton(tr("文件对话框"));
    fontPushBtn=new QPushButton(tr("字体对话框"));
    inputPushBtn=new QPushButton(tr("输入对话框"));
    pagePushBtn=new QPushButton(tr("页设计对话框"));
    progressPushBtn=new QPushButton(tr("进度对话框"));
    printPushBtn=new QPushButton(tr("打印对话框"));

    gridLayout->addWidget(colorPushBtn,0,0,1,1);
    gridLayout->addWidget(errorPushBtn,0,1,1,1);
    gridLayout->addWidget(filePushBtn,0,2,1,1);
    gridLayout->addWidget(fontPushBtn,1,0,1,1);
    gridLayout->addWidget(inputPushBtn,1,1,1,1);
    gridLayout->addWidget(pagePushBtn,1,2,1,1);
    gridLayout->addWidget(progressPushBtn,2,0,1,1);
    gridLayout->addWidget(printPushBtn,2,1,1,1);
    gridLayout->addWidget(displayTextEdit,3,0,3,3);

    //将gridLayout设置为内建对话框CBuiltinDlg对象的顶层布局管理器
    setLayout(gridLayout);

    //将信号与槽关联起来
    connect(colorPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
    connect(errorPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
    connect(filePushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
    connect(fontPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
    connect(inputPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
    connect(pagePushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
    connect(progressPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
    connect(printPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));

    //设置对话框的标题和大小
    setWindowTitle(tr("内建对话框"));
    resize(400,300);
}

//重写槽函数doPushBtn()
void CBuiltinDlg::doPushBtn()
{
    btn=qobject_cast<QPushButton*>(sender());
    if(btn==colorPushBtn)
    {
        //颜色对话框
        QPalette palette=displayTextEdit->palette();
        const QColor& color=QColorDialog::getColor(palette.color(QPalette::Base),this);
        if(color.isValid())
        {
            palette.setColor(QPalette::Base,color);
            displayTextEdit->setPalette(palette);
        }
    }
    else if(btn==errorPushBtn)
    {
        //错误消息框
        QErrorMessage box(this);
        box.setWindowTitle(tr("错误消息框"));
        box.showMessage(tr("错误消息框实例xx。"));
        box.showMessage(tr("错误消息框实例xx。"));
        box.showMessage(tr("错误消息框实例xx。"));
        box.showMessage(tr("错误消息框实例yy。"));
        box.showMessage(tr("错误消息框实例zz。"));
        box.exec();
    }
    else if(btn==filePushBtn)
    {
        //文件对话框
        QString fileName=QFileDialog::getOpenFileName(this,tr("打开文件"),
                                                      "/home/czm",
                                                      tr("任何文件(*.*)"
                                                      ";;文本文件(*.txt)"
                                                      ";;XML文件(*.xml)"));
        displayTextEdit->setText(fileName);
    }
    else if(btn==fontPushBtn)
    {
        //字体对话框
        bool ok;
        const QFont& font=QFontDialog::getFont(&ok,
                                               displayTextEdit->font(),
                                               this,
                                               tr("字体对话框"));
        if(ok)
        {
            //如果<确定>,设置字体
            displayTextEdit->setFont(font);
        }
    }
    else if(btn==inputPushBtn)
    {
        //输入对话框
        bool ok;
        QString text=QInputDialog::getText(this,
                                           tr("输入对话框"),
                                           tr("输入文本:"),
                                           QLineEdit::Normal,
                                           QDir::home().dirName(),
                                           &ok);
        if(ok && !text.isEmpty())
            displayTextEdit->setText(text);
    }
    else if(btn==pagePushBtn)
    {
        //页设置对话框
        QPrinter printer;
        QPageSetupDialog dlg(&printer,this);
        dlg.setWindowTitle(tr("页设置对话框"));
        if(dlg.exec()==QDialog::Accepted)
        {
            //进行下一步的处理
        }
    }
    else if(btn==progressPushBtn)
    {
        //进度对话框
        QProgressDialog progress(tr("正在复制文件..."),
                                 tr("取消"),
                                 0,
                                 10000,
                                 this);
        progress.setWindowModality(Qt::WindowModal);
        progress.setWindowTitle(tr("进度对话框"));
        progress.show();
        for(int i=0;i<10000;i++)
        {
            progress.setValue(i);
            qApp->processEvents();
            if(progress.wasCanceled())
                break;
            //...复制文件处理
            qDebug()<<i;
        }
        progress.setValue(10000);
    }
    else if(btn==printPushBtn)
    {
        //打印对话框
        QPrinter printer;
        QPrintDialog dlg(&printer,this);
        dlg.setWindowTitle(tr("打印对话框"));
        if(dlg.exec()==QDialog::Accepted)
        {
            //进行下一步处理
        }
    }
}
注:曹函数的开头,首先是获取发送信号的QPushButton对象的指针。函数QObject:sender()返回发送信号的对象的指针,返回类型为QObject*。模板函数
T qobject_cast(QObject* object)
完成类型的转换,将<QObject*>类型的对象指针转换为类型为<T *>的对象指针,如果转换成功,返回正确的对象指针,否则返回0。(类型T必须是直接或间接继承自QObject的类,并且在该类的定义里有Q_OBJECT宏变量,否则qobject_cast()函数的返回值是未定义的。)

1、创建颜色对话框的代码解析
1.1 QTextEdit::palette()获取文本编辑框对象displayTextEdit的调色板;
1.2 用QColorDialog::getColor()函数创建并显示一个模态的颜色对话框,并返回用户选择的颜色对象的常量引用赋给变量color;如果用户点击“取消”按钮,颜色对话框将返回一
个无效的颜色;颜色对话框的颜色初始化为palette.color(QPalette::Base),即文本编辑框的背景色;父窗口部件为this。
1.3 QColor::isValid()函数判断颜色对话框返回的颜色是否有效。
    -〉若有效,函数QPalette::setColor()设置调色板的背景颜色为颜色对话框返回的颜色;
    -〉此处的QPalette::setColor()有两个参数,第一个参数QPalette::Base指定了调色板的角色,告诉程序应该设置调色板的所有三个颜色组中的哪一个角色的颜色;第二个参数color指定应该设置的颜色。
1.4 函数QTextEdit::setPalette()重新设置文本编辑框的调色板。
     
2、创建错误消息框的代码的解析
2.1 函数QErrorMessage::showMessage()功能是在错误消息框中显示错误信息。

3、文件对话框的代码的解析
3.1 函数QFileDialog::getOpenFileName()功能是获取用户选择的文件名并显示在文本编辑框中。
3.2 该函数在此处有4个参数:
    第1个参数指定文件对话框的父窗口部件;
    第2个参数指定文件对话框的标题;
    第3个参数指定文件对话框的默认路径;
    第4个参数指定了文件对话框的多个文件过滤器,过滤器之间通过两个分号“;;”间隔

4、字体对话框的代码的解析
4.1 函数QFontDialog::getFont()创建并显示一个字体对话框。此处有4个参数:
    第1个参数是一个输入参数,用于标识用户的选择状态。单击“正确”ok变量为true;单击“取消”按钮ok变量为false;
    第2个参数指定了对话框的初始颜色,当用户取消颜色的选择时,字体对话框将初始颜色作为返回值;
    第3个参数指定了父窗口部件;
    第4个参数制定了字体对话框的标题;

5、输入对话框的代码的解析
5.1 QInputDialog::getText()函数创建并显示一个文本输入对话框。这里有6个参数:
    前2个参数分别指定了输入对话框的父窗口部件和对话框的标题;
    第3个参数指定了标签的显示文本;
    第4个参数指定了行编辑框QLineEdit输入内容的显示模式;
    第5个参数制定了行编辑框默认的显示内容,函数QDir::home()返回用户的home路径,QDir::dirName()返回路径的名字;
    第6个参数标识用户的选择状态,和函数QFontDialog::getFont()的第一个参数作用相同;

6、进度对话框的代码的解析
6.1 首先调用了QProgressDialog的构造函数,创建了一个进度对话框的栈对象。该构造函数有5个参数:
    第一个参数是一个字符串,他指定了显示给用户的提示信息,表明当前正在进行的工作;
    第2个参数指定了“取消”按钮的显示文本,如果该参数为0,进度对话框将没有“取消”按钮;
    第3,4个参数分别指定了操作的步数,在这个实例中,假定进度对话框显示复制10000个文件的进展情况,第3个参数设定为0,第4个参数设定为10000,即这两个参数的差值决定了这个复制操作的步数为10000;
    第5个参数指定了进度对话框的父窗口部件;
6.2 函数setWindowModality()设置进度对话框的类型为Qt::WindowModal,即模态对话框。

builtin.cpp

#include<QtGui/QtGui>
#include"builtindlg.h"
int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
    CBuiltinDlg dlg;
    return dlg.exec();

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值