繁体   English   中英

如何让信号和插槽跨类连接?

[英]How to have signals and slots connect across classes?

我正在尝试制作一个带有工具栏、侧边栏和文本框的基本文本编辑器。 我的程序需要使用 QPushButton(在我的“工具栏”类中)使 QTextEdit 中的文本变为粗体(在我的 TextEdit 类中)。 这是一个示例代码片段:

import sys
from PyQt5.QtWidgets import QPushButton, QTextEdit, QWidget, QMainWindow
from PyQt5.Qt import Qt, QApplication, QVBoxLayout, QHBoxLayout, QFrame, QFont


class ToolBar(QWidget):
    def __init__(self):
        super().__init__()
        layout = QHBoxLayout()
        self.btn = QPushButton(self, text="Bold")
        layout.addWidget(self.btn)

        self.italic = QPushButton(self, text="Italic")
        layout.addWidget(self.italic)
        t = TextEdit()

        # This is the line that isn't working
        self.btn.clicked.connect(lambda: t.set_bold())
        # I've tried this without the lambda, and also with 'TextEdit.set_bold' but they didn't work
        # It would also be nice to do the same for the italic buttons and other buttons in my toolbar 
        self.setLayout(layout)


class TextEdit(QWidget):
    def __init__(self):
        super().__init__()
        self.textEdit = QTextEdit(self)
        # self.set_bold() <-- If I were to run this, then the text box would become bold, so I know that it's not an error with the function

    def set_bold(self):
        # print("function activated") <-- This statement shows that the function is indeed executing
        self.font = QFont("Helvetica", 14)
        self.font.setBold(True)
        self.textEdit.setFont(self.font)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        central_widget = QFrame()
        layout = QVBoxLayout()

        self.boldButton = ToolBar()
        layout.addWidget(self.boldButton)

        self.textBox = TextEdit()
        layout.addWidget(self.textBox)

        central_widget.setLayout(layout)

        self.setCentralWidget(central_widget)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

我尝试放置一个打印语句来确认 function 正在执行,就是这样。 我没有收到任何错误消息,所以我似乎无法弄清楚该怎么做。

连接必须发生在对象具有公共 scope 的地方,在这种情况下,在 MainWindow class 内。

class ToolBar(QWidget):
    def __init__(self):
        super().__init__()

        self.bold_button = QPushButton(text="Bold")
        self.italic_button = QPushButton(text="Italic")

        layout = QHBoxLayout(self)
        layout.addWidget(self.bold_button)
        layout.addWidget(self.italic_button)


class TextEdit(QWidget):
    def __init__(self):
        super().__init__()
        self.textEdit = QTextEdit(self)

    def set_bold(self):
        font = QFont("Helvetica", 14)
        font.setBold(True)
        self.textEdit.setFont(font)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.toolbar = ToolBar()
        self.textBox = TextEdit()

        central_widget = QFrame()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.toolbar)
        layout.addWidget(self.textBox)
        self.setCentralWidget(central_widget)

        self.toolbar.bold_button.clicked.connect(self.textBox.set_bold)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM