VS2019+QT 制作自定義控件
1.新建Qt Designer Custom Widget 項目
2. 項目中會有如下2個文件
myMultiCustomControl.h myMultiCustomControlPlugin.h
3.打開 myMultiCustomControl.h,代碼如下
class QDESIGNER_WIDGET_EXPORT MultiCustomControl : public QWidget { Q_OBJECT Q_PROPERTY(QString mText READ tipText WRITE setTipText) public: MultiCustomControl(QWidget *parent = Q_NULLPTR); ~MultiCustomControl(); public: inline QString tipText() {return mTipLable == nullptr ? QString() : mTipLable->text(); } void setTipText(const QString& text); private: QHBoxLayout* mMainLayout = nullptr; QLabel* mTipLable = nullptr; QPushButton* mPushButton = nullptr; };
myMultiCustomControl.cpp代碼如下
#include "myMultiCustomControl.h" MultiCustomControl::MultiCustomControl(QWidget *parent) : QWidget(parent) { mMainLayout = new QHBoxLayout; mTipLable = new QLabel("tipLable"); mPushButton = new QPushButton("pushBtn"); mMainLayout->addWidget(mTipLable); mMainLayout->addWidget(mPushButton); this->setLayout(mMainLayout); } MultiCustomControl::~MultiCustomControl() { } void MultiCustomControl::setTipText(const QString & text) { mTipLable->setText(text); }
myMultiCustomControlPlugin.h
#pragma once #include <QtUiPlugin/QDesignerCustomWidgetInterface> class MultiCustomControlPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: MultiCustomControlPlugin(QObject *parent = Q_NULLPTR); bool isContainer() const; bool isInitialized() const; QIcon icon() const; QString domXml() const; QString group() const; QString includeFile() const; QString name() const; QString toolTip() const; QString whatsThis() const; QWidget *createWidget(QWidget *parent); void initialize(QDesignerFormEditorInterface *core); private: bool initialized; };
myMultiCustomControlPlugin.cpp
#include "myMultiCustomControl.h" #include "myMultiCustomControlPlugin.h" #include <QtCore/QtPlugin> MultiCustomControlPlugin::MultiCustomControlPlugin(QObject *parent) : QObject(parent) { initialized = false; } void MultiCustomControlPlugin::initialize(QDesignerFormEditorInterface * /*core*/) { if (initialized) return; initialized = true; } bool MultiCustomControlPlugin::isInitialized() const { return initialized; } QWidget *MultiCustomControlPlugin::createWidget(QWidget *parent) { return new MultiCustomControl(parent); } QString MultiCustomControlPlugin::name() const { return QStringLiteral("MultiCustomControl"); } QString MultiCustomControlPlugin::group() const { return QStringLiteral("CustomControl"); } QIcon MultiCustomControlPlugin::icon() const { return QIcon(); } QString MultiCustomControlPlugin::toolTip() const { return QString(); } QString MultiCustomControlPlugin::whatsThis() const { return QString(); } bool MultiCustomControlPlugin::isContainer() const { return false; } QString MultiCustomControlPlugin::domXml() const { return QLatin1String("<widget class=\"MultiCustomControl\" name=\"mMultiCustomControl\">\n</widget>\n"); } QString MultiCustomControlPlugin::includeFile() const { return QLatin1String("customControl/myMultiCustomControl.h"); }
4.同理添加另外的控件,代碼如下
myTabWidgetControl.h
#pragma once #include <QWidget> #include <QTabWidget> #include <QHBoxLayout> class TabWidgetControl : public QWidget { Q_OBJECT public: TabWidgetControl(QWidget* parent = Q_NULLPTR); ~TabWidgetControl(); private: QTabWidget* mTabWidget = nullptr; QHBoxLayout* mMainLayout = nullptr; };
myTabWidgetControl.cpp
#include "myTabWidgetControl.h" TabWidgetControl::TabWidgetControl(QWidget* parent) :QWidget(parent) { mMainLayout = new QHBoxLayout; mTabWidget = new QTabWidget(this); mTabWidget->setObjectName("tabWidget"); mTabWidget->setFixedHeight(90); mMainLayout->addWidget(mTabWidget); this->setLayout(mMainLayout); } TabWidgetControl::~TabWidgetControl() { }
myTabWidgetControlPlugin.h
#pragma once #include <QtUiPlugin/QDesignerCustomWidgetInterface> class TabWidgetControlPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: TabWidgetControlPlugin(QObject *parent = Q_NULLPTR); ~TabWidgetControlPlugin(); public: bool isContainer() const; bool isInitialized() const; QIcon icon() const; QString domXml() const; QString group() const; QString includeFile() const; QString name() const; QString toolTip() const; QString whatsThis() const; QWidget *createWidget(QWidget *parent); void initialize(QDesignerFormEditorInterface *core); private: bool initialized; };
myTabWidgetControlPlugin.cpp
#include "myTabWidgetControlPlugin.h" #include "myTabWidgetControl.h" TabWidgetControlPlugin::TabWidgetControlPlugin(QObject * parent) : QObject(parent) { initialized = false; } TabWidgetControlPlugin::~TabWidgetControlPlugin() { } bool TabWidgetControlPlugin::isContainer() const { return false; } bool TabWidgetControlPlugin::isInitialized() const { return initialized; } QIcon TabWidgetControlPlugin::icon() const { return QIcon(); } QString TabWidgetControlPlugin::domXml() const { return QLatin1String("<widget class=\"TabWidgetControl\" name=\"mTabWidgetControl\">\n</widget>\n"); } QString TabWidgetControlPlugin::group() const { return QStringLiteral("CustomControl"); } QString TabWidgetControlPlugin::includeFile() const { return QLatin1String("customControl/myTabWidgetControl.h"); } QString TabWidgetControlPlugin::name() const { return QStringLiteral("TabWidgetControl"); } QString TabWidgetControlPlugin::toolTip() const { return QString(); } QString TabWidgetControlPlugin::whatsThis() const { return QString(); } QWidget * TabWidgetControlPlugin::createWidget(QWidget * parent) { return new TabWidgetControl(parent); } void TabWidgetControlPlugin::initialize(QDesignerFormEditorInterface * core) { if (initialized) return; initialized = true; }
5. 由於上面是一個個的單獨的控件,因此我們需要再添加一個導出聲明頭文件和一個控件集合
myMultiCustom_define.h
myMultiPlugins.h
代碼如下
myMultiCustom_define.h
#pragma once #ifndef BUILD_STATIC # if defined(MULTICUSTOMCONTROL_LIB) # define MULTICUSTOMCONTRO_EXPORT Q_DECL_EXPORT # else # define MULTICUSTOMCONTRO_EXPORT Q_DECL_IMPORT # pragma comment(lib, "myMultiCustomControl.lib") # endif #else # define MULTICUSTOMCONTRO_EXPORT #endif
myMultiPlugins.h
#pragma once #include "myMultiCustom_define.h" #include <qobject.h> #include <QtDesigner/QDesignerCustomWidgetCollectionInterface> class MULTICUSTOMCONTRO_EXPORT MultiPlugins : public QObject, public QDesignerCustomWidgetCollectionInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetCollectionInterface") Q_INTERFACES(QDesignerCustomWidgetCollectionInterface) public: MultiPlugins(QObject* parent = 0); QList<QDesignerCustomWidgetInterface*> customWidgets() const override; private: QList<QDesignerCustomWidgetInterface*> mWidgets; };
myMultiPlugins.cpp
#include "myMultiPlugins.h" #include "myMultiCustomControlPlugin.h" #include "myTabWidgetControlPlugin.h" MultiPlugins::MultiPlugins(QObject* parent) :QObject(parent) { mWidgets.append(new MultiCustomControlPlugin(this)); mWidgets.append(new TabWidgetControlPlugin(this)); } QList<QDesignerCustomWidgetInterface*> MultiPlugins::customWidgets() const { return mWidgets; }
然后對項目進行編譯,會得到一個dll和lib文件
myMultiCustomControl.dll
myMultiCustomControl.lib
5.將庫和頭文件分別拷貝到下面地方
5.1 先明確自己的QT環境在哪里 可以通過VS的擴展中查看 如下所示
5.2將dll和lib分別拷貝到下面路徑
這個時候再打開 設計面板就能看見我們創建的控件了,
注意事項:庫的編譯環境要與設計器的一致,打開QTCreator 點擊幫助
可以查看具體的編譯環境
至此,基於VS2019 +QT5.11.2的多控件的封裝就已經完成。