【问题标题】:How to enable button after QListWidget is no longer emptyQListWidget不再为空后如何启用按钮
【发布时间】:2020-10-21 06:09:14
【问题描述】:

我希望在我的 QListWidget 中有项目之前禁用我的按钮。我在 AppDemo 类中尝试了 if 和 while 语句,但我觉得它需要在 ListBoxWidget 类中进行更改,但是 listBoxWidget 已经是 AppDemo 的子类。 示例代码:

 import sys, os
    from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QPushButton
    from PyQt5.QtCore import Qt, QUrl


class ListBoxWidget(QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)
        self.resize(600, 600)

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()

            links = []
            for url in event.mimeData().urls():
                if url.isLocalFile():
                    links.append(str(url.toLocalFile()))
                else:
                    links.append(str(url.toString()))
            self.addItems(links)
        else:
            event.ignore()


class AppDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(1200, 600)

        self.listbox_view = ListBoxWidget(self)

        self.btn = QPushButton('Get Value', self)
        self.btn.setEnabled(False)
        self.btn.setGeometry(850, 400, 200, 50)
        self.btn.clicked.connect(lambda: print(self.getSelectedItem()))

    def getSelectedItem(self):
        item = QListWidgetItem(self.listbox_view.currentItem())
        return item.text()


if __name__ == '__main__':
    app = QApplication(sys.argv)

    demo = AppDemo()
    demo.show()

    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt5 qpushbutton qlistwidget


    【解决方案1】:

    您必须使用当与视图关联的模型的行数发生变化时发出的信号,这些信号必须调用根据 QListWidget 中的项目数更新按钮状态的方法:

    class AppDemo(QMainWindow):
        def __init__(self):
            super().__init__()
            self.resize(1200, 600)
    
            self.listbox_view = ListBoxWidget(self)
            self.listbox_view.model().modelReset.connect(self.handle_rows_changed)
            self.listbox_view.model().rowsInserted.connect(self.handle_rows_changed)
            self.listbox_view.model().rowsRemoved.connect(self.handle_rows_changed)
            self.listbox_view.model().layoutChanged.connect(self.handle_rows_changed)
            
            self.btn = QPushButton("Get Value", self)
            self.btn.setEnabled(False)
            self.btn.setGeometry(850, 400, 200, 50)
            self.btn.clicked.connect(lambda: print(self.getSelectedItem()))
    
        def getSelectedItem(self):
            item = self.listbox_view.currentItem()
            return item.text() if item is not None else ""
    
        def handle_rows_changed(self):
            self.btn.setEnabled(bool(self.listbox_view.count()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2021-07-03
      • 2023-03-30
      • 2021-09-10
      • 1970-01-01
      • 2020-11-08
      相关资源
      最近更新 更多