为什么这个 PyQt5 Qlistwidget signal + slot 不工作?
Why does this PyQt5 Qlistwidget signal + slot not working?
我一直在努力使这项工作奏效,但就是行不通。我没有得到任何错误,只是明显的不合规。它只是不想添加 QListWidget 项,或更改 QLabel。
我做了一个MainWindowClass。它是主要的小部件,我有一个布局和一个按钮。在它的 dockwidget 中我有一个 QListWidget。
我从按钮发出信号并将其连接到 dockwidget 列表中的插槽。
连接就在那里。当我按下按钮时,dockwidgetcontents class 中的方法是 运行。
但它不会将项目添加到列表小部件。并且不会产生任何错误。
代码如下:
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()
当我在表格中输入问题时,我也阅读了所有建议的问题,但我一定没有理解一些重要的或先决条件。
虽然我发现您对其他问题的所有回答都非常有价值,但如果您的回答能指出我所缺少的参考资料,我将不胜感激,这样我就可以理解问题,而不仅仅是 copy/paste固定码。
主要问题是您正在尝试连接到 DockWidgetContents
的 新实例 ,它也会在 start()
后立即被删除returns.
这个新实例显然是无用的,因为它已经存在,但您没有直接的方法来获取它,因为当您将小部件添加到布局和父级时,您会“即时”创建所有 类。
请记住,虽然创建“动态实例”在技术上不是问题,但它不允许您保留对这些实例的引用。
您必须创建对小部件的适当引用并正确连接它们。
在这里您可以看到所需的修改:
class MainWindowClass(QMainWindow):
def __init__(self):
super().__init__()
self.init_UI()
self.TheDockWidget()
<b>self.mainWidget.topLeftWidget.signal.connect(
self.dockWidgetContents._add_item)</b>
def init_UI(self):
self.setGeometry(100, 100, 400, 200)
self.setWindowTitle("Test App")
<b>self.mainWidget = MainWidgetClass()
self.setCentralWidget(self.mainWidget)</b>
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))
<b>self.dockWidgetContents = DockWidgetContents()
self.dockWidget.setWidget(self.dockWidgetContents)</b>
class MainWidgetClass(QWidget):
def __init__(self):
super().__init__()
self.init_UI()
def init_UI(self):
mainLayout = QGridLayout()
self.setLayout(mainLayout)
<b>self.topLeftWidget = TopLeftWidgetClass()
mainLayout.addWidget(self.topLeftWidget, 0, 0)</b>
我一直在努力使这项工作奏效,但就是行不通。我没有得到任何错误,只是明显的不合规。它只是不想添加 QListWidget 项,或更改 QLabel。
我做了一个MainWindowClass。它是主要的小部件,我有一个布局和一个按钮。在它的 dockwidget 中我有一个 QListWidget。 我从按钮发出信号并将其连接到 dockwidget 列表中的插槽。 连接就在那里。当我按下按钮时,dockwidgetcontents class 中的方法是 运行。 但它不会将项目添加到列表小部件。并且不会产生任何错误。
代码如下:
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()
当我在表格中输入问题时,我也阅读了所有建议的问题,但我一定没有理解一些重要的或先决条件。
虽然我发现您对其他问题的所有回答都非常有价值,但如果您的回答能指出我所缺少的参考资料,我将不胜感激,这样我就可以理解问题,而不仅仅是 copy/paste固定码。
主要问题是您正在尝试连接到 DockWidgetContents
的 新实例 ,它也会在 start()
后立即被删除returns.
这个新实例显然是无用的,因为它已经存在,但您没有直接的方法来获取它,因为当您将小部件添加到布局和父级时,您会“即时”创建所有 类。
请记住,虽然创建“动态实例”在技术上不是问题,但它不允许您保留对这些实例的引用。
您必须创建对小部件的适当引用并正确连接它们。
在这里您可以看到所需的修改:
class MainWindowClass(QMainWindow):
def __init__(self):
super().__init__()
self.init_UI()
self.TheDockWidget()
<b>self.mainWidget.topLeftWidget.signal.connect(
self.dockWidgetContents._add_item)</b>
def init_UI(self):
self.setGeometry(100, 100, 400, 200)
self.setWindowTitle("Test App")
<b>self.mainWidget = MainWidgetClass()
self.setCentralWidget(self.mainWidget)</b>
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))
<b>self.dockWidgetContents = DockWidgetContents()
self.dockWidget.setWidget(self.dockWidgetContents)</b>
class MainWidgetClass(QWidget):
def __init__(self):
super().__init__()
self.init_UI()
def init_UI(self):
mainLayout = QGridLayout()
self.setLayout(mainLayout)
<b>self.topLeftWidget = TopLeftWidgetClass()
mainLayout.addWidget(self.topLeftWidget, 0, 0)</b>