Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么PyQt5 Qlistwidget会发出+;插槽不工作?_Python_Pyqt5_Signals_Slots - Fatal编程技术网

Python 为什么PyQt5 Qlistwidget会发出+;插槽不工作?

Python 为什么PyQt5 Qlistwidget会发出+;插槽不工作?,python,pyqt5,signals,slots,Python,Pyqt5,Signals,Slots,我一直在努力使这项工作,但它就是做不到。我没有错误,只是明显的不服从。它只是不想添加QListWidget项或更改QLabel 我上了一堂课。它是主要的小部件,我有一个布局和一个按钮。在dockwidget中,我有一个QListWidget。 我从按钮发出一个信号,并将其连接到dockwidget列表中的一个插槽。 连接在那里。当我按下按钮时,dockwidgetcontents类中的方法正在运行。 但它不会将项目添加到listwidget。不会产生任何错误 代码如下: from PyQt5.Q

我一直在努力使这项工作,但它就是做不到。我没有错误,只是明显的不服从。它只是不想添加QListWidget项或更改QLabel

我上了一堂课。它是主要的小部件,我有一个布局和一个按钮。在dockwidget中,我有一个QListWidget。 我从按钮发出一个信号,并将其连接到dockwidget列表中的一个插槽。 连接在那里。当我按下按钮时,dockwidgetcontents类中的方法正在运行。 但它不会将项目添加到listwidget。不会产生任何错误

代码如下:

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

class AppClass:

    def __init__(self):
        super().__init__()
        app = QApplication(sys.argv)
        window = MainWindowClass()
        window.show()
        sys.exit(app.exec_())


class MainWindowClass(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_UI()
        self.TheDockWidget()

    def init_UI(self):
        self.setGeometry(100, 100, 400, 200)
        self.setWindowTitle("Test App")
        self.setCentralWidget(MainWidgetClass())

    def TheDockWidget(self):
        self.dockWidget = QDockWidget('Status:')
        self.dockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable)
        self.addDockWidget(Qt.RightDockWidgetArea, self.dockWidget)
        self.dockWidget.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))
        self.dockWidget.setWidget(DockWidgetContents())


class DockWidgetContents(QWidget):

    def __init__(self):
        super().__init__()
        self.init_UI()

    def init_UI(self):
        layout = QVBoxLayout()
        self.setLayout(layout)
        self.button3 = QPushButton()
        self.button3.setText("button3")
        layout.addWidget(self.button3)
        self.listwidget = QListWidget()
        layout.addWidget(self.listwidget)
        self.listwidget.addItem("Ready.")
        self.label = QLabel("initial")
        layout.addWidget(self.label)

    @pyqtSlot(str, str, int)
    def _add_item(self, strA, strB, int1):
        self.label.setText("yes")           # why does this not work??
        self.listwidget.addItem(strA)       # why does this not work??
        self.listwidget.addItem(strB)       # why does this not work??
        self.listwidget.addItem(str(int1))  # why does this not work??
        print(strA, strB, int1)             # but this works fine.


class MainWidgetClass(QWidget):

    def __init__(self):
        super().__init__()
        self.init_UI()

    def init_UI(self):
        mainLayout = QGridLayout()
        self.setLayout(mainLayout)
        mainLayout.addWidget(TopLeftWidgetClass(), 0, 0)


class TopLeftWidgetClass(QWidget):
    signal = pyqtSignal(str, str, int)

    def __init__(self):
        super().__init__()
        self.init_UI()

    def init_UI(self):
        layout = QHBoxLayout()
        self.setLayout(layout)
        self.button1 = QPushButton("button1")
        layout.addWidget(self.button1)
        self.button1.clicked.connect(self.start)

    def start(self):
        otherClass = DockWidgetContents()
        self.signal.connect(otherClass._add_item)
        self.signal.emit("one", "two", 3)


if __name__ == '__main__':
    AppClass()
当我在表格中输入问题时,我也阅读了所有建议的问题,但我一定没有理解其中的关键或先决条件


虽然我发现您对其他问题的所有答案都非常有价值,但如果您的答案能指出我缺少的参考资料,这样我就可以理解问题,而不仅仅是复制/粘贴固定代码。

主要问题是您试图连接到
DockWidgetContents
的新实例,一旦
start()
返回,它也会立即被删除

这个新实例显然是无用的,因为它已经存在,但是您没有直接的方法来获得它,因为当您向布局和父级添加小部件时,您会“动态”创建所有类。
请记住,虽然创建“动态实例”在技术上不是问题,但它不允许您保留对这些实例的引用

您必须创建对小部件的适当引用并正确连接它们

在这里,您可以看到所需的修改:

class MainWindowClass(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_UI()
        self.TheDockWidget()
        self.mainWidget.topLeftWidget.signal.connect(
            self.dockWidgetContents._add_item)

    def init_UI(self):
        self.setGeometry(100, 100, 400, 200)
        self.setWindowTitle("Test App")
        self.mainWidget = MainWidgetClass()
        self.setCentralWidget(self.mainWidget)

    def TheDockWidget(self):
        self.dockWidget = QDockWidget('Status:')
        self.dockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable)
        self.addDockWidget(Qt.RightDockWidgetArea, self.dockWidget)
        self.dockWidget.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))
        self.dockWidgetContents = DockWidgetContents()
        self.dockWidget.setWidget(self.dockWidgetContents)


class MainWidgetClass(QWidget):

    def __init__(self):
        super().__init__()
        self.init_UI()

    def init_UI(self):
        mainLayout = QGridLayout()
        self.setLayout(mainLayout)
        self.topLeftWidget = TopLeftWidgetClass()
        mainLayout.addWidget(self.topLeftWidget, 0, 0)
class MainWindowClass(QMainWindow):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.init_UI()
self.TheDockWidget()
self.mainWidget.topLeftWidget.signal.connect(
self.dockWidgetContents.\u添加\u项)
def初始用户界面(自身):
self.setGeometry(100100400200)
self.setWindowTitle(“测试应用程序”)
self.mainWidget=MainWidgetClass()
self.setCentralWidget(self.mainWidget)
def TheDockWidget(self):
self.dockWidget=QDockWidget('状态:')
self.dockWidget.setFeatures(qdockwidgetmovable | qdockwidgetwidget.DockWidgetFloatable)
self.addDockWidget(Qt.RightDockWidgetArea,self.dockWidget)
self.dockWidget.setSizePolicy(QSizePolicy(QSizePolicy.Minimum,QSizePolicy.Minimum))
self.dockWidgetContents=dockWidgetContents()
self.dockWidget.setWidget(self.dockWidgetContents)
类MainWidgetClass(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.init_UI()
def初始用户界面(自身):
mainLayout=QGridLayout()
self.setLayout(主布局)
self.topLeftWidget=TopLeftWidgetClass()
mainLayout.addWidget(self.topLeftWidget,0,0)

谢谢,现在我明白了。我发现我也错过了主窗口类中dock和按钮之间的连接。这是有意义的,因为它是所有类的父类,所以连接必须通过它。对我来说,很难对所有这些东西保持清醒的头脑,因为在我开始学习python之前,我只使用了bash。@user122121那么,如果可以的话,我有几点建议:在创建函数时不要夸大:虽然分离函数(有时)可以更好地“可视化”和整洁代码,函数最重要的好处是它可以而且应该再次使用。在您的代码中,除了从
\u add\u item
start
之外,所有其他函数都是无用的,因为它们将在
\uuuuu init\uuuu
中只调用一次,实际上并不会提高可读性。只需移动
\u init\u UI
中的所有
init\u UI
。然后,就不需要为类添加“Class”后缀,因为它是reduntant:从名称大写的事实(事实上,
dockwidget
应该有小写的“T”)可以清楚地知道它们是类,因为函数和变量不应该大写)。我从某人那里学到了这个
init\u UI
。我发现它在功能上是无用的。我这样做只是为了整洁。但如果这是个坏习惯,我就放弃。谢谢类后缀只是为了我自己的理智。不知怎么的,这让我更容易了。但是正如您所说,大写的名称已经足够好地指示了一个类。谢谢你的建议。