[PyQT5]QComboBox下拉框给选项增加按钮

PyQt5:实现带按钮的QComboBox选项
本文介绍如何在PyQt5中自定义QComboBox,添加具有独立QPushButton的行。作者通过重写addItem函数,创建一个简单的ComboBox_with_button类,并提供了一个基础的使用示例。虽然功能简陋,但对初学者提供了一种改造思路。

        常规的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也会有困难吧?所以希望这篇文章能帮到你们。

Qt中,要向QComboBox(组合框)下拉框增加选项,你可以按照以下步骤操作: 1. **初始化QComboBox**: - 创建QComboBox实例并添加默认选项[^2]: ```cpp QComboBox comboBox; comboBox.addItem("Option 1"); comboBox.addItem("Option 2"); ``` 2. **添加QCheckBox作为子元素**: - 使用`addSection()`方法先添加一个标题,然后使用`addItem()`添加QCheckBox[^1]: ```cpp comboBox.addSection("Checkboxes Section"); QCheckBox checkBox1("Checkbox 1"); comboBox.addItem(&checkBox1); ``` 或者,如果你想要在下拉列表项中直接创建QCheckBox,可以在构造函数中设置其父窗口: ```cpp QCheckBox checkBox1("Checkbox 1", &comboBox); comboBox.setItemData(comboBox.findText("Checkbox 1"), QVariant::fromValue(checkBox1)); ``` 3. **设置模型**: - 如果你想通过更复杂的模型来管理选项,可以使用QListWidget或其他继承自QObject的模型类。比如,设置QListWidget作为QComboBox的model: ```cpp QListWidget modelList; // 填充modelList comboBox.setModel(&modelList); ``` 4. **绑定信号与槽**: - 当QComboBox的内容变化时,可以连接信号和槽来响应用户的交互。 **Python 示例 (PyQT5)**: 对于PythonPyQt5,虽然原生的`addItem()`不支持复杂控件,但可以通过自定义item来实现类似功能[^3]。这通常涉及到创建自定义的`QWidget`子类,然后将其作为`QComboBox`的item。例如,你可以创建一个包含了QCheckBox的`CustomItem`类。 注意,PythonQt库可能会有不同的接口和语法,所以在实际操作时可能需要查阅文档或使用特定版本的库来找到正确的API。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值