[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
中发射信号。
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自定义控件以及控件的提升