[Qt5] 自定義QCombox類實現showPopup事件
本文設計到多種Qt的關鍵操作:
- 繼承,自定義Qt類
- 自定義Qt signal
- 在Qt creator使用“提升”來使用自定義Qt元件
背景
利用QComboBox來實現選擇串列埠,想在點選QComboBox的時候重新整理串列埠列表,實現如下效果:
但是Qt5 並沒有實現QComboBox的點選事件,在stackoverflow中,建議自己過載 showPopup
方法。
但是自己重定義的元件怎麼在Qt Creator中應用呢?在參考2中給出了方法,利用Qt的提升功能,將QComboBox提升為自定義的QComboBox。下面介紹具體的操作方法和注意事項。
實現自定義QComboBox
首先需要建立一個自定義的QComboBox類並繼承於 QComboBox
QComboBoxMoreSignal.h
檔案
#pragma once #include <qcombobox.h> class QComboBoxMoreSignal : public QComboBox { Q_OBJECT signals: void combo_box_showpopup(QComboBoxMoreSignal* self); public: explicit QComboBoxMoreSignal(QWidget* parent = nullptr); private: void showPopup() override; };
在參考3中,提到
自定義訊號槽必須要有Q_OBJCT
因為繼承的QComboBox中的建構函式用explicit
關鍵字聲明瞭,因此需要再次實現一次構造方法,並在構造方法中呼叫父類構造方法。
然後我們重寫父類的showPopup
方法,注意後方加上override
關鍵字。
最後我們定義了showpopup的訊號函式,訊號函式可以由qt自動生成,因此我們只需要宣告不需要自己定義。
QComboBoxMoreSignal.cpp
檔案
#include "QComboBoxMoreSignal.h" QComboBoxMoreSignal::QComboBoxMoreSignal(QWidget* parent /*= nullptr*/): QComboBox(parent){ } void QComboBoxMoreSignal::showPopup() { emit combo_box_showpopup(this); QComboBox::showPopup(); }
實現檔案中,注意構造方法需要呼叫父類構造方法;
在過載showPopup
也要注意重新呼叫父類的showPopup
在showPopup
中發射訊號。
在Qt creator中使用提升使用自定義控制元件
建立完自定義的QComboBoxMoreSignal
之後,就需要在Qt creator使用它
在繪製頁面的時候,主要還是使用QComboBox來繪製,在繪製之後,右擊控制元件,並選擇提升為
首先選擇基類為原始控制元件的型別,QComboBox
之後新增你自定義的型別 QComboBoxMoreSignal
,注意標頭檔案的檔名稱。
點選新增後,在上方選中,點選提升,就完成了。
參考
QComboBox click event - stackoverflow
Qt自定義控制元件以及控制元件的提升
QT 手動建立訊號函式 與 槽函式
自定義ComboBox——獲取串列埠號
Qt自定義控制元件以及控制元件的提升