来自窗口的 pyqt 信号不更改主窗口小部件

Posted

技术标签:

【中文标题】来自窗口的 pyqt 信号不更改主窗口小部件【英文标题】:pyqt signal from a window not changing the main window widgets 【发布时间】:2020-09-29 10:10:29 【问题描述】:

我可以使用信号在两个窗口之间传递值, 我想要更改纯文本,同时按下另一个窗口的按钮。 但是 insertPlainText 甚至 text.show() 都不起作用

我尝试将信号发送到主窗口的初始化部分, 尝试更新、重绘,但都不起作用。

感谢您的任何帮助,谢谢!


SearchWindow类中的search_send方法到MainWindow方法test_

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.tag_box.hide()

    def test_(self, i): # -------problem here------------------
        print(i)  // <- value here were right
        self.ui.tag_box.insertPlainText(i)  # -------Plain Text does not change-------
        self.ui.tag_box.show()# -------Plain Text does not show either--------------


class SearchWindow(QtWidgets.QMainWindow):
    
    signal=pyqtSignal(str)

    def __init__(self, endpoint=None, user=None, password=None, points_link=None):
        super(SearchWindow, self).__init__()
        self.ui = Ui_Search()
        self.ui.setupUi(self)
        self.ui.pushButton_2.clicked.connect(self.search_send)

    def search_send(self): # -------problem here------------------
        tag_list = [tag1,tag2, tag3]
        otherClass = MainWindow()
        self.signal.connect(otherClass.test_)
        for k in tag_list:
            self.signal.emit(k)

if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

【问题讨论】:

请提供minimal reproducible example @S.Nick 抱歉,已更新 复制粘贴时双反斜杠搞砸了。并感谢您的更新。 这不是mre。首先,您还没有发布Ui_DialogUi_Search 的内容。此外,您没有显示搜索窗口是如何创建的。即它是在用户按下按钮时创建的吗?无论如何,您的代码的问题在于,在SearchWindow.search_send 中,您正在创建MainWindow 的第二个实例(未显示)并将信号连接到第二个实例的插槽而不是显示的原始插槽。您需要将信号连接到window 的插槽。如何执行此操作取决于创建/管理搜索窗口​​的方式。 @Heike 抱歉没有发布 ui 内容,我以为我停留在一个基本概念中,有人可能会在不编译我的代码的情况下弄清楚,然后你来了,你确实解决了我的问题,通过改变MainWindow() 到 window ,效果很好,非常感谢!! 【参考方案1】:

由于我们不清楚Ui_Dialog 包含什么,我无法准确判断出什么问题,但可以告诉您应该如何使用信号

这是Signal 的示例,它将文本传输到SlotPyQt5 中的名称可能不同 - 相应更改。

from PySide2.QtWidgets import QWidget, QApplication, QPlainTextEdit, QTextEdit, QVBoxLayout
from PySide2.QtCore import Signal, Slot
import sys


class MainWindow(QWidget):
    sig = Signal(str)

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("Main")
        self.layout = QVBoxLayout()
        self.text = QTextEdit()
        self.layout.addWidget(self.text)
        self.setLayout(self.layout)

        self.text.textChanged.connect(self.onChange)

    def onChange(self):
        self.sig.emit(self.text.toPlainText())


class SubWindow(QWidget):

    def __init__(self, connect_target: MainWindow):
        super(SubWindow, self).__init__()
        self.setWindowTitle("Sub")
        self.layout = QVBoxLayout()
        self.text = QPlainTextEdit()
        self.layout.addWidget(self.text)
        self.setLayout(self.layout)

        connect_target.sig.connect(self.onSignal)

    @Slot(str)
    def onSignal(self, text):
        self.text.insertPlainText(text + '\r\n')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    window_sub = SubWindow(window)
    window_sub.show()
    sys.exit(app.exec_())

Main 中的任何内容都将根据需要插入QPlainTextEdit

【讨论】:

原来是我用错槽接收信号了,谢谢你的回复

以上是关于来自窗口的 pyqt 信号不更改主窗口小部件的主要内容,如果未能解决你的问题,请参考以下文章

按下保存按钮pyqt5后关闭第二个小部件

从主窗口中的 UI 文件加载带有信号槽定义的小部件

如何在 Qt 中将消息从子窗口小部件发送到父窗口?

在子窗口小部件活动时阻止 QMa​​inWindow ,pyqt

控制 PyQt QFormLayout 中的小部件放置

如何在 PyQt5 中用另一个小部件替换一个小部件