1.Qt类的封装

    科技2025-12-30  9

    C++是面向对象的语言,即封装类——将对象的数据、行为等等封装在一起。 C++和Qt都提供了基类,但在使用过程中往往是不够的,因此,面向对象的编程思想是:运用现有的类封装自己的类,以便使用,也是C语言中的模块化思想。

    举例说明:

    查找对话框

    main.cpp

    #include "finddialog.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication app(argc, argv); FindDialog *dialog=new FindDialog; dialog->show(); return app.exec(); }

    因为Qt中没有finddialog类,所有需要利用基类来进行封装,之后再再应用程序中使用这个类。

    finddialog.h

    /***finddialog类的封装过程***/ #ifndef FINDDIALOG_H #define FINDDIALOG_H #include <QDialog> //Qt中对话框的基类,QDialog从QWidget类中派生出来 #include <QCheckBox> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QHBoxLayout> #include <QVBoxLayout> class QCheckBox; //复选框 class QLabel; class QLineEdit; class QPushButton; class FindDialog : public QDialog { Q_OBJECT //对于所有定义了信号和槽的类,都要在类定义的开始处声明Q_OBJECT宏 public: FindDialog(QWidget *parent = nullptr); //Qt窗口部件类的定义方式,parent的参数指定了它的父窗口部件,默认为空 ~FindDialog(); signals: void findNext(const QString &str,Qt::CaseSensitivity cs); //find键按下后发出两个信号 void findPrevious(const QString &str,Qt::CaseSensitivity cs); private slots: //槽定义 void findClicked(); void enableFindButton(const QString &text); void textChanged(const QString &text); private: QLabel *label; QLineEdit *lineEdit; QCheckBox *caseCheckBox; QCheckBox *backwardCheckBox; QPushButton *findButton; QPushButton *closeButton; }; #endif // FINDDIALOG_H

    以上就是finddialog类的封装过程,包括了私有数据、信号和槽,即行为方式。

    finddialog.cpp

    finddialog.cpp中对这些行为进行实现:

    #include <QtGui> #include <Qt> #include "finddialog.h" FindDialog::FindDialog(QWidget *parent):QDialog(parent) { label=new QLabel(tr("Find &what:")); lineEdit=new QLineEdit; label->setBuddy(lineEdit); //伙伴关系 caseCheckBox=new QCheckBox(tr("Math &case")); backwardCheckBox=new QCheckBox(tr("Search &backward")); findButton=new QPushButton(tr("&Find")); //&用于快捷键 findButton->setDefault(true); findButton->setEnabled(false); closeButton=new QPushButton(tr("Close")); connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(enableFindButton(const QString &))); connect(findButton,SIGNAL(clicked()),this,SLOT(findClicked())); connect(closeButton,SIGNAL(clicked()),this,SLOT(close())); QHBoxLayout *topLeftLayout=new QHBoxLayout; //水平布局 topLeftLayout->addWidget(label); topLeftLayout->addWidget(lineEdit); QVBoxLayout *leftLayout=new QVBoxLayout; //垂直布局 leftLayout->addLayout(topLeftLayout); leftLayout->addWidget(caseCheckBox); leftLayout->addWidget(backwardCheckBox); QVBoxLayout *rightLayout=new QVBoxLayout; rightLayout->addWidget(findButton); rightLayout->addWidget(closeButton); rightLayout->addStretch(); QHBoxLayout *mainLayout=new QHBoxLayout; mainLayout->addLayout(leftLayout); mainLayout->addLayout(rightLayout); setLayout(mainLayout); setWindowTitle(tr("Find")); setFixedHeight(sizeHint().height()); } void FindDialog::findClicked() { QString text=lineEdit->text(); Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitivity : Qt::CaseInsensitive; if(backwardCheckBox->isChecked()) { emit findPrevious(text,cs); } else { emit findNext(text,cs); } } void FindDialog::enableFindButton(const QString &text) { findButton->setEnabled(!text.isEmpty()); } FindDialog::~FindDialog() { }
    Processed: 0.015, SQL: 9