【问题标题】:the slot don't work for QListWidget itemClicked (pyqt)该插槽不适用于 QListWidget itemClicked (pyqt)
【发布时间】:2019-06-23 12:24:04
【问题描述】:

我创建了一个 QListWidget,我想将 itemClicked 与我的插槽连接起来。下面的代码就OK了:当我点击item时,listwidgetclicked已经被调用了

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.imagelabel = QLabel()
        layout = QVBoxLayout()
        self.imagelabel.setLayout(layout)
        self.setCentralWidget(self.imagelabel)

        label1 = QLabel('hello, world')
        layout.addWidget(label1)

        newlistWidget = QListWidget()
        newlistWidget.addItem(QListWidgetItem('item3'))
        newlistWidget.addItem(QListWidgetItem('item4'))
        layout.addWidget(newlistWidget)
        newlistWidget.itemClicked.connect(self.listwidgetclicked)

    def listwidgetclicked(self):
        print('click')

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

但是,我想把 GUI 的所有代码放在一起。所以我创建了一个类,并将这个类中的信号和槽连接起来。当我单击该项目时,listwidgetclicked 不起作用,代码是:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class GUI(QObject):
    def __init__(self):
        super(GUI, self).__init__()
        self.layout = QVBoxLayout()
        self.initGUI()

    def getLayout(self):
        return self.layout

    def initGUI(self):
        self.listWidget = QListWidget()
        self.listWidget.addItem(QListWidgetItem('item1'))
        self.listWidget.addItem(QListWidgetItem('item2'))
        self.listWidget.itemClicked.connect(self.listwidgetclicked)
        self.layout.addWidget(self.listWidget)

    def listwidgetclicked(self, item):
        print('click')

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.imagelabel = QLabel()
        layout = QVBoxLayout()
        self.imagelabel.setLayout(layout)
        self.setCentralWidget(self.imagelabel)

        label1 = QLabel('hello, world')
        layout.addWidget(label1)
        listWidget = GUI()
        layout.addLayout(listWidget.getLayout())

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

我不知道这两个代码有什么区别。

【问题讨论】:

    标签: python-3.x pyqt connect qlistwidget


    【解决方案1】:

    试试看:

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    
    class GUI(QListWidget):
        def __init__(self):
            super(GUI, self).__init__()
            self.layout = QVBoxLayout()
            self.initGUI()
    
    #    def getLayout(self):
    #        return self.layout
    
        def initGUI(self):
    #        self.listWidget = QListWidget()
            self.addItem(QListWidgetItem('item1'))
            self.addItem(QListWidgetItem('item2'))
            self.itemClicked.connect(self.listwidgetclicked)
            self.layout.addWidget(self)       #.listWidget)
    
        def listwidgetclicked(self, item):
            print('!!! click {}'.format(item.text()))
    
    class MainWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    
            self.imagelabel = QLabel()
            layout = QVBoxLayout()
            self.imagelabel.setLayout(layout)
            self.setCentralWidget(self.imagelabel)
    
            label1 = QLabel('hello, world')
            layout.addWidget(label1)
            listWidget = GUI()
    #        layout.addLayout(listWidget.getLayout())  # ---
            layout.addWidget(listWidget)               # +++
    
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()
    

    更新:

    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    import sys
    
    class GUI(QObject):
        def __init__(self):
            super(GUI, self).__init__()
            self.layout = QVBoxLayout()
            self.initGUI()
    
        def getLayout(self):
            return self.layout
    
        def initGUI(self):
            self.listWidget = QListWidget()
            self.listWidget.addItem(QListWidgetItem('item1'))
            self.listWidget.addItem(QListWidgetItem('item2'))
            self.listWidget.itemClicked.connect(self.listwidgetclicked)
            self.layout.addWidget(self.listWidget)
    
        def listwidgetclicked(self, item):
            print('click -> {}'.format(item.text()))
    
    class MainWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    
            self.imagelabel = QLabel()
            layout = QVBoxLayout()
            self.imagelabel.setLayout(layout)
            self.setCentralWidget(self.imagelabel)
    
            label1 = QLabel('hello, world')
            layout.addWidget(label1)
    
    
            self.listWidget = GUI()                        # <--- + self.
            layout.addLayout(self.listWidget.getLayout())  # <--- + self.
    
    
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()
    

    【讨论】:

    • 这段代码没问题。但是,此代码类似于我的第一个代码。在我的项目中,我想使用一个类(GUI)来初始化所有的小部件。所以,我希望GUI类中有一个布局,所有的小部件都放在布局中。我不需要 QListWidget 的子类。我仍然想弄清楚我的第二个代码有什么问题。
    • 我加了一个例子
    • 非常感谢。我想知道为什么我的第一个代码没问题?在第一个和第二个代码中,我没有将 QListwidget 保存在 self.但是第一个代码有效,而第二个代码失败了。为什么?
    猜你喜欢
    • 2014-06-12
    • 2012-07-13
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多