[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自定义控件以及控件的提升

posted @ 2021-10-24 15:19  ArtisticZhao  阅读(2057)  评论(0编辑  收藏  举报