【问题标题】:python pyqt5 getting output every time i change the qlistwidget index每次我更改 qlistwidget 索引时,python pyqt5 都会获得输出
【发布时间】:2022-11-10 01:25:52
【问题描述】:

so 基本上我有 3 个列表小部件,问题是当我在一个列表中选择一行并在另一个列表中选择另一行时,两个列表的索引都高于 -1(意味着它们都被选中) . 我希望他们做的是,当我按下不同列表上的另一行时,第一个列表索引变回 -1 使该列表中的行未被选中。 为了做到这一点,我每次从任何列表中选择一行时都需要获取输入,除非有其他选项可以解决这个问题。 希望这不是太复杂而无法理解。任何帮助或尝试帮助将不胜感激。 这是问题的图片:

【问题讨论】:

  • 你在哪个部分有问题?你试过什么?

标签: python pyqt5


【解决方案1】:

您可以将QListWidget 子类化并让它在选择更改时发出自定义信号,该信号将小部件的实例作为参数发出。

然后在父小部件中,您可以有一个单独的插槽,用于取消选择适用于所有三个列表的其他两个列表小部件。


更新

根据 cmets 中提供的信息,您实际上不需要子类化 QListWidget,而是可以使用 currentItemChanged 信号获取实例,因为它发出先前选择的项目和它已更改为的项目作为参数。然后使用QListWidgetItem.listWidget() 方法,您可以获得发出信号的列表的实例。

这是一个例子:

class Window(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.layout = QHBoxLayout(self)
        self.resize(500,500)
        self.lists = [QListWidget(parent=self) for _ in range(3)]
        for widget in self.lists:
            self.layout.addWidget(widget)
            for i in range(30):
                item = QListWidgetItem(type=0)
                item.setText(str(i))
                widget.insertItem(i, item)
            widget.currentItemChanged.connect(self.deselect)

    def deselect(self, new, old):
        if not new: return
        instance = new.listWidget()
        for widget in self.lists:
            if widget != instance:
                widget.setCurrentRow(-1)

【讨论】:

  • 实际上,对于这种特定情况,子类不是必需的:您可以连接到currentItemChanged 并使用item.listWidget() 从第一个参数的项目中获取“选定”列表小部件。唯一的区别是您还必须检查item 是否不是None,因为setCurrentRow(-1) 仍将调用currentItemChanged() 并将选定的参数设置为None 并使用先前的选择取消选定。一个建议:考虑到这个论点,“取消选择”这个名字可能是反直觉的;它可能应该类似于“deselectOthers”。
  • @musicamante 聪明,我什至没有想到这一点
  • 请注意,您的更新并不完全正确:第二个参数(您所谓的“新”)是取消选择,而您实际上对此并不感兴趣(因为它是取消选择,您不需要对任何列表执行任何操作小部件);你应该只关心第一个(“旧”,实际上应该是“新”,因为它是新的当前项目) 并继续取消选择其他仅当它不是 None 时才使用小部件。虽然您当前的实现并不是完全错误的(没有递归),但为取消选择执行 for 循环对于所需的内容毫无意义。
  • 现在完美了! :-)
  • 是的,我做了示例中的内容并且我工作了。我永远不会自己想出这个。谢谢您的帮助。
【解决方案2】:

我认为您需要连接到 QListWidget 的currentRowChanged 信号。

如果您的窗口布局纯粹是在代码中,那么连接信号将如下所示:

self.listwidget1.currentRowChanged.connect(self.on_listwidget1_currentRowChanged)
self.listwidget2.currentRowChanged.connect(self.on_listwidget2_currentRowChanged)
self.listwidget2.currentRowChanged.connect(self.on_listwidget3_currentRowChanged)

如果您使用的是 Qt Designer,则连接由 pyuic 自动完成。那么您处理 QListWidgets 更改的方法是:

def on_listwidget1_currentRowChanged(self, currentRow):
    <put your code here>

def on_listwidget2_currentRowChanged(self, currentRow):
    <put your code here>

def on_listwidget3_currentRowChanged(self, currentRow):
    <put your code here>

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多