尝试在 mousepress 事件中使用来自另一个组合框的值加载自定义组合框

Posted

技术标签:

【中文标题】尝试在 mousepress 事件中使用来自另一个组合框的值加载自定义组合框【英文标题】:Trying to load custom combobox with values from another combobox on mousepress event 【发布时间】:2021-01-01 17:47:39 【问题描述】:

我正在尝试使用 pyqt5 中的其他组合框来控制组合框中的选项。第一个是普通的组合框,控制第二个的输入量。第二个是自定义可检查组合框,我希望用户检查结果以确定第三个组合框中的选项。当我尝试从事件过滤器中加载鼠标触发器上的第三个组合框时,程序崩溃了。

桂的图片:

自定义组合框图片:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QHBoxLayout
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont
from PyQt5.QtCore import Qt

qt_creator_file = "comboboxes.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qt_creator_file)

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        for i in range(6):
            self.comboBox.addItem("Combobox " + str(i))

        for i in range(6):
            self.comboBox_2.addItem("Combobox2 " + str(i))

        for i in range(6):
            self.comboBox_3.addItem("Combobox3 " + str(i))

        self.comboBox.currentIndexChanged.connect(self.UpdateCombo2)
        #self.comboBox_2.highlighted.connect(self.UpdateCombo3)
        #self.comboBox_3.highlighted.connect(self.UpdateCombo3)

        self.comboBox_3.installEventFilter(self)

    def eventFilter(self, target, event):
        if target == self.comboBox_3 and event.type() == QtCore.QEvent.MouseButtonPress:
            print('Button Press')
            self.UpdateCombo3()

        return False


    def UpdateCombo2(self, index):
        self.comboBox_2.clear()
        for i in range(index):
            self.comboBox_2.addItem('ComboBox2' + str(index))

    def UpdateCombo3(self, index):
        self.comboBox_3.clear()
        list = self.comboBox_2.currentData()
        for i in list:
            self.comboBox_3.addItem('ComboBox3' + str(i))




app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

这是 CustomWidgets.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QHBoxLayout
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont
from PyQt5.QtCore import Qt

class CheckableComboBox(QComboBox):
    def __init__(self, parent=None):
        super(CheckableComboBox, self).__init__(parent)
        self.view().pressed.connect(self.handleItemPressed)

        # once there is a checkState set, it is rendered
    # here we assume default Unchecked
    def addItem(self, item):
        super(CheckableComboBox, self).addItem(item)
        item = self.model().item(self.count()-1,0)
        #item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
        item.setFlags(QtCore.Qt.ItemIsEnabled)
        item.setCheckState(QtCore.Qt.Unchecked)

    def handleItemPressed(self, index):
        item = self.model().itemFromIndex(index)

        # checking if item is checked
        if item.checkState() == Qt.Checked:

            # making it unchecked
            item.setCheckState(Qt.Unchecked)

            # if not checked
        else:
            # making the item checked
            item.setCheckState(Qt.Checked)

    def itemChecked(self, index):
        item = self.model().item(i,0)
        return item.checkState() == QtCore.Qt.Checked

    def currentData(self):
        # Return the list of selected items data
        res = []
        for i in range(self.model().rowCount()):
            if self.model().item(i).checkState() == Qt.Checked:
                res.append(self.model().item(i).text())
        return res

这是 ui 文件

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="verticalLayoutWidget">
    <property name="geometry">
     <rect>
      <x>220</x>
      <y>150</y>
      <width>341</width>
      <height>191</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QComboBox" name="comboBox">
       <property name="font">
        <font>
         <pointsize>16</pointsize>
        </font>
       </property>
      </widget>
     </item>
     <item>
      <widget class="CheckableComboBox" name="comboBox_2">
       <property name="font">
        <font>
         <pointsize>16</pointsize>
        </font>
       </property>
      </widget>
     </item>
     <item>
      <widget class="CheckableComboBox" name="comboBox_3">
       <property name="font">
        <font>
         <pointsize>16</pointsize>
        </font>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>CheckableComboBox</class>
   <extends>QComboBox</extends>
   <header>CustomWidgets</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

【问题讨论】:

分享comboboxes.ui文件 抱歉刚刚编辑! 您在 UpdateCombo3() 中使用了 index 参数,但在事件过滤器中您没有发送任何参数。如果您不打算使用 index 参数,请删除它,否则您要么设置默认值,要么根据需要在函数调用中正确添加该参数。 它不再崩溃,但由于我使用 clear() ,每次我尝试重新打开它时检查状态都会消失。有什么方法可以重置选中的项目? Nvm 我想通了。 【参考方案1】:

您在 UpdateCombo3() 中使用了索引参数,但在事件过滤器中您没有发送任何参数。如果您不打算使用 index 参数,请删除它,否则您可以设置默认值或根据需要在函数调用中正确添加该参数。 – 音乐家

【讨论】:

以上是关于尝试在 mousepress 事件中使用来自另一个组合框的值加载自定义组合框的主要内容,如果未能解决你的问题,请参考以下文章

accept()函数用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;ignore()函数则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递(看一下QWidget::mousePress

MousePressed 和 mouseReleased 创建对象

使用来自另一个图像的事件缩放和平移图像

Java.awt.robot mousepress 没有任何效果

检查来自另一个 ViewController 的按钮

如何在 win32 gui 应用程序中使用另一个事件循环