1. 程式人生 > 其它 >[Qt5] 自定義QCombox類實現showPopup事件

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

本文設計到多種Qt的關鍵操作: - 繼承,自定義Qt類 - 自定義Qt signal - 在Qt creator使用“提升”來使用自定義Qt元件

本文設計到多種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自定義控制元件以及控制元件的提升