微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个 PyQt5 Qlistwidget 信号 + 插槽不起作用?

如何解决为什么这个 PyQt5 Qlistwidget 信号 + 插槽不起作用?

我一直在努力使这项工作发挥作用,但没有成功。我没有收到任何错误,只是简单的不合规。它只是不想添加 QListWidget 项,或更改 QLabel。

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

代码如下:

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,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)


class TopLeftWidgetClass(QWidget):
    signal = pyqtSignal(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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?