[Qt5] 自定義QCombox類實現showPopup事件


本文設計到多種Qt的關鍵操作:

  • 繼承,自定義Qt類
  • 自定義Qt signal
  • 在Qt creator使用“提升”來使用自定義Qt組件

背景

利用QComboBox來實現選擇串口,想在點擊QComboBox的時候刷新串口列表,實現如下效果:

image

但是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來繪制,在繪制之后,右擊控件,並選擇提升為

image

首先選擇基類為原始控件的類型,QComboBox
之后添加你自定義的類型 QComboBoxMoreSignal,注意頭文件的文件名稱。
點擊添加后,在上方選中,點擊提升,就完成了。
image
PyQt版中, headerfile其實要填寫python的引用路徑, 會轉換為 from <Headerfile> import <Promoted class name>這樣的引用語句, 要填對對應的路徑!

參考

QComboBox click event - stackoverflow
Qt自定義控件以及控件的提升
QT 手動創建信號函數 與 槽函數
自定義ComboBox——獲取串口號
Qt自定義控件以及控件的提升


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM