本文設計到多種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
中發射信號。
Python版
補充一個PyQt版的參考
from PyQt5.QtWidgets import QComboBox
from PyQt5 import QtCore
class QComboBox2(QComboBox):
pop_up = QtCore.pyqtSignal()
def showPopup(self):
self.pop_up.emit()
super(QComboBox2, self).showPopup()
綁定回調函數
self._ui.cb_serial.pop_up.connect(self._refresh_serial)
在Qt creator中使用提升使用自定義控件
創建完自定義的QComboBoxMoreSignal
之后,就需要在Qt creator使用它
在繪制頁面的時候,主要還是使用QComboBox來繪制,在繪制之后,右擊控件,並選擇提升為
首先選擇基類為原始控件的類型,QComboBox
之后添加你自定義的類型 QComboBoxMoreSignal
,注意頭文件的文件名稱。
點擊添加后,在上方選中,點擊提升,就完成了。
PyQt版中, headerfile其實要填寫python的引用路徑, 會轉換為 from <Headerfile> import <Promoted class name>
這樣的引用語句, 要填對對應的路徑!
參考
QComboBox click event - stackoverflow
Qt自定義控件以及控件的提升
QT 手動創建信號函數 與 槽函數
自定義ComboBox——獲取串口號
Qt自定義控件以及控件的提升