尝试在 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 创建对象