常规的QComboBox的addItem函数只能添加图片和文字,但是其实带按钮的选项非常常见。由于我初学pyqt,但是查阅资料没有查到,只看到了一个优秀C++版本。本文最后实现的效果实际上是简陋的,可能需要经过很多调整。这个下拉框QCombobox的每一行都有一个独立的QPushButton。
当然,addItem函数并没有传入QPushButton参数,因为我还没想好这些QPushButton具体执行哪些功能。为了编辑这个QPushButton,可以将它改为函数参数传入什么的,这里就用了一个空的QPushButton。
from PyQt5 import QtWidgets
class ComboBox_with_button(QComboBox):
def __init__(self, parent = None, ** kwargs):
super().__init__(parent = parent, ** kwargs)
self.listview = QListWidget(parent)
self.viewmodel = self.listview.model()
#使用QListWidget作为View,用它的model作为model
self.setView(self.listview)
self.setModel(self.viewmodel)
self.view().setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
def addItem(self, text):
item_widget = QWidget()
layout = QHBoxLayout(item_widget)
layout.addStretch()
layout.addWidget(QPushButton(self))
#在此处对QPushButton进行操作
layout.setContentsMargins(0, 0, 0, 0);
item_list = self.listview
item_wrap = QListWidgetItem(item_list)
item_wrap.setText(text)
item_list.setItemWidget(item_wrap, item_widget)
如何评价这段代码呢?因为博主对qt的理解也很浅薄,所以只能用自己的理解稍加解释吧。重写QCombobox需要设置两个参数,listview和viewmodel,分别对应widget和model。widget好说,model一开始我没有找到它对应的类,后来发现了他居然有model()函数返回这个,试了试可以运行。ScrollBarAsNeeded就是下拉框不够长的时候,右边出现滑动条,这个是细枝末节。
使用样例如下。我没有给出完整的可运行代码,你需要一个MainWindow窗口来嵌入它。但是我在一开始放了两张截图展示效果。
self.comboBox = ComboBox_with_button(MainWindow)
self.comboBox.setGeometry(QtCore.QRect(0, 800, 300, 30))
for i in range(100):
self.comboBox.addItem("Label " + str(i + 1) + " (显示中)")
为了实现这个功能我翻了好久的资料,最后参考了C++版本QComboBox下拉框给选项增加删除按钮。我所做的相当于只是改成了python。我发现Qt的python和C++版本的函数基本上是共有的,甚至名字都相差不多。但是可能自己完全照着C++改成python也会有困难吧?所以希望这篇文章能帮到你们。