1. 程式人生 > >學習筆記之qt4程式中引入自定義視窗部件之多繼承方式

學習筆記之qt4程式中引入自定義視窗部件之多繼承方式

      多繼承中,需要從標準的 QWidget類和Qt designer繪製的介面類繼承。這樣,繼承自qt標準的視窗部件類和介面類的子類就可以直接訪問其父類的公有成員和保護成員。

1、用qt creator建立一個名為mulinherit的empty qt project工程並把這個工程存放在一個名為findfile的資料夾中(用qt designer建立的findfileform.ui檔案也存放在這個資料夾中)。
2、右擊該工程將已有的findfileform.ui檔案新增到該工程中。
3、在該工程中新增檔案findfileform.cpp,findfileform.h,mulinherit.cpp,程式碼如下:

findfileform.h

#ifndef FINDFILEFORM_H
#define FINDFILEFORM_H

#include<QStringList>
#include<QDir>

#include"ui_findfileform.h"

class CFindFileForm:public QWidget,
        public Ui_FindFileForm
{
    Q_OBJECT
public:
    CFindFileForm(QWidget *parent=0);
};

#endif // FINDFILEFORM_H

注:多繼承的情況下,Qt的類必須要放在其他類的前面,即必須先繼承QWidget,再繼承Ui_FindFileForm。這是因為元物件編譯器假定第一個繼承的類是QObject的子類。此外,Qt不支援對QObject(或QObject子類)的虛繼承。

findfileform.cpp

#include<QtGui>

#include"findfileform.h"

CFindFileForm::CFindFileForm(QWidget *parent)
    :QWidget(parent)
{
    setupUi(this);
    statusLabel->setText(tr("就緒"));
    resultLabel->setText(tr("找到0個檔案"));
    nameComboBox->setEditText("*");
    dirComboBox->setEditText(QDir::currentPath());
    dirComboBox->addItem(QDir::currentPath());
    sensitiveCheckBox->setEnabled(false);
    stopPushButton->setEnabled(false);
}

注:與單一繼承方式使用ui檔案不同的是,多繼承方式下可以在類的實現程式碼中直接引用qt designer繪製的字視窗部件。

mulinherit.cpp

#include<QtGui/QApplication>
#include<QtCore/QTextCodec>

#include"findfileform.h"

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));
    Q_INIT_RESOURCE(findfile);

    CFindFileForm form;
    form.show();

    return app.exec();
}

       在應用程式中,多繼承方式使用qt designer中繪製的介面視窗部件比單一繼承方式更簡單直接;同直接使用方式相比較,多繼承方式更具程式碼的可擴充套件性。因此,在應用程式中,一般的都使用多繼承方式引用qt designer繪製的使用者介面物件。

mulinlerit.pro

FORMS += \
    ../findfileform.ui

RESOURCES += \
    ../findfile.qrc

HEADERS += \
    findfileform.h

SOURCES += \
    findfileform.cpp \
    mulinherit.cpp