Qt 4开发实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.6 自定义(Custom)消息框

当以上所有消息框都不能满足开发的需求时,Qt还允许Custom(自定义)消息框。包括消息框的图标、按钮、内容等都可根据需要进行设定。下面介绍一下自定义(Custom)消息框的具体创建方法:

(1) 添加该工程的提供主要显示标准消息对话框界面的函数所在的文件,在“DialogExample”项目名上单击鼠标右键,在弹出的快捷菜单中选择“Add New...”菜单项,在弹出的对话框中选择“C++ Class”选项。单击“OK”按钮,弹出“C++ Class Wizard”对话框,在Base class后面的下拉列表框中输入基类名“QDialog”,在Class name后面的文本框中输入类的名称“CustomDlg”。

(2) 单击“Next”按钮,单击“Finish”按钮,在该工程中就添加了customdlg.h头文件和customdlg.cpp源文件。

(3) 打开“msgboxdlg.h”头文件,自动生成的代码如下:

        #include <QDialog>
        class CustomDlg : public QDialog
        {
        public:
            CustomDlg();
        };

(4) 打开“msgboxdlg.cpp”文件,自动生成的代码如下:

        #include "customdlg.h"
        CustomDlg::CustomDlg()
        {
        }

下面是完成主对话框的操作过程:

(1) 在dialog.h中添加private成员变量:

          QPushButton *CustomBtn;
          QLabel *label;

(2) 添加private slots槽函数:

            void showCustomDlg();

(3) 在dialog.cpp中的构造函数中添加如下代码:

          CustomBtn =new QPushButton;
          CustomBtn->setText(tr("用户自定义消息对话框实例"));
          label =new QLabel;
          label->setFrameStyle(QFrame::Panel|QFrame::Sunken);

以及添加布局管理:

          mainLayout->addWidget(CustomBtn,4,0);
          mainLayout->addWidget(label,4,1);

在Dialog构造函数的最后添加事件关联代码:

          connect(CustomBtn,SIGNAL(clicked()),this,SLOT(showCustomDlg()));

其中,dialog.cpp文件中的槽函数showCustomDlg()实现的具体代码如下:

        void Dialog::showCustomDlg()
        {
            label->setText(tr("Custom Message Box"));
            QMessageBox customMsgBox;
            customMsgBox.setWindowTitle(tr("用户自定义消息框"));  //设置消息框的标题
            QPushButton
    *yesBtn=customMsgBox.addButton(tr("Yes"),QMessageBox::ActionRole);
            QPushButton
    *noBtn=customMsgBox.addButton(tr("No"),QMessageBox::ActionRole);
            QPushButton *cancelBtn=customMsgBox.addButton(QMessageBox::Cancel);
            customMsgBox.setText(tr("这是一个用户自定义消息框!"));
            customMsgBox.setIconPixmap(QPixmap("CustomTest.png"));
            customMsgBox.exec();
            if(customMsgBox.clickedButton()==yesBtn)
                label->setText("Custom Message Box/Yes");
            if(customMsgBox.clickedButton()==noBtn)
        label->setText("Custom Message Box/No");
    if(customMsgBox.clickedButton()==cancelBtn)
        label->setText("Custom Message Box/Cancel");
    return;
}

在开始部分加上头文件:

        #include <QMessageBox>

其中:

QPushButton *yesBtn=customMsgBox.addButton(tr("Yes"),QMessageBox::ActionRole):定义消息框所需的按钮,由于QMessageBox::standardButtons只提供了常用的一些按钮,并不能满足所有应用的需求,因此QMessageBox类提供了一个addButton()函数来为消息框增加自定义的按钮,addButton()函数的第1个参数为按钮显示的文字,第2个参数为按钮类型的描述。

QPushButton *cancelBtn=customMsgBox.addButton(QMessageBox::Cancel):为addButton()函数加入一个标准按钮。消息框将会按调用addButton()函数的先后次序在消息框中由左至右依次插入按钮。

customMsgBox.setText(tr("这是一个用户自定义消息框!")):设置自定义消息框中显示的提示信息内容。

customMsgBox.setIconPixmap(QPixmap("CustomTest.png")):设置自定义消息框的图标。

customMsgBox.exec():显示此自定义消息框。

(4) 运行该程序后,单击“用户自定义消息框”按钮后显示效果如图5.7所示。