【问题标题】:swipe to check/uncheck in QListWidget滑动以选中/取消选中 QListWidget
【发布时间】:2017-10-19 01:09:20
【问题描述】:

我想在 PyQt5 中设置一个 QListWidget 以在我滑动时选中或取消选中复选框。

这是我的界面:

还有我的代码:

import sys
from PyQt5.QtCore import QDate, QSize, Qt
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class VerifyDialog(QDialog):
    def __init__(self, parent=None):
        super(VerifyDialog, self).__init__(parent)

        self.listWidget = QListWidget()

        for i in range(100):
            item = QListWidgetItem("Item %i" % i)
            # could be Qt.Unchecked; setting it makes the check appear
            item.setCheckState(Qt.Checked)
            self.listWidget.addItem(item)

        runButton = QPushButton("Run")
        runButton.clicked.connect(self.exec)

        cancelButton = QPushButton("Cancel")
        cancelButton.clicked.connect(self.close)

        horizontalLayout = QHBoxLayout()
        horizontalLayout.addWidget(self.listWidget, 1)

        buttonsLayout = QHBoxLayout()
        buttonsLayout.addStretch(1)
        buttonsLayout.addWidget(runButton)
        buttonsLayout.addWidget(cancelButton)

        mainLayout = QVBoxLayout()
        mainLayout.addLayout(horizontalLayout)
        mainLayout.addSpacing(12)
        mainLayout.addLayout(buttonsLayout)

        self.setLayout(mainLayout)
        self.setWindowTitle("Config Dialog")
        self.show()

if __name__=="__main__":
    app = QApplication(sys.argv)
    dialog = VerifyDialog()
    sys.exit(app.exec_())

我想单击第 4 项并取消选中它(这比单击框更容易),然后我想向下拖动并取消选中许多其他项。

【问题讨论】:

    标签: python pyqt pyqt5 swipe qlistwidget


    【解决方案1】:

    您必须使用itemEntered 信号向您发送鼠标下的对象。

    self.listWidget.itemEntered.connect(lambda item: item.setCheckState(Qt.Checked if item.checkState()==Qt.Unchecked else Qt.Unchecked))
    

    完整代码:

    import sys
    from PyQt5.QtCore import QDate, QSize, Qt
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    class VerifyDialog(QDialog):
        def __init__(self, parent=None):
            super(VerifyDialog, self).__init__(parent)
    
            self.listWidget = QListWidget()
    
            self.listWidget.itemEntered.connect(lambda item: item.setCheckState(Qt.Checked if item.checkState()==Qt.Unchecked else Qt.Unchecked))
    
    
            for i in range(100):
                item = QListWidgetItem("Item %i" % i)
                # could be Qt.Unchecked; setting it makes the check appear
                item.setCheckState(Qt.Checked)
                self.listWidget.addItem(item)
    
            runButton = QPushButton("Run")
            runButton.clicked.connect(self.exec)
    
            cancelButton = QPushButton("Cancel")
            cancelButton.clicked.connect(self.close)
    
            horizontalLayout = QHBoxLayout()
            horizontalLayout.addWidget(self.listWidget, 1)
    
            buttonsLayout = QHBoxLayout()
            buttonsLayout.addStretch(1)
            buttonsLayout.addWidget(runButton)
            buttonsLayout.addWidget(cancelButton)
    
            mainLayout = QVBoxLayout()
            mainLayout.addLayout(horizontalLayout)
            mainLayout.addSpacing(12)
            mainLayout.addLayout(buttonsLayout)
    
            self.setLayout(mainLayout)
            self.setWindowTitle("Config Dialog")
            self.show()
    
    
    if __name__=="__main__":
        app = QApplication(sys.argv)
        dialog = VerifyDialog()
        sys.exit(app.exec_())
    

    【讨论】:

    • 是的,我只是在检查一下。它需要一些改进,但大部分都在那里。
    • 好的,我做了改进。现在它会记住单击的第一个项目的状态变化,然后在您拖动到其他项目时将其传播。
    • @vy32 使用 lambda 函数,因此您不必创建新函数。你已经试过我的答案了。
    • @vy32 如果您想进行更改,您将完成编辑您的问题。肯定会消除这种变化。
    • 为什么你认为不应该编辑代码?我看到代码一直在 SO 上编辑;请提供参考,因为它没有被编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多