使用 Qt 设计器时如何让 self.close 工作?

How to get self.close to work, when using Qt designer?

感谢阅读!

问题通常是,当使用来自 QtDesigner 的转换后的 .py 文件时,我真的不知道在哪里正确编码信号和槽,而且我似乎没有找到任何关于这个特定问题的有用答案。 我的初始代码由三个文件组成,顺便说一下,这些文件大多不是我自己创建的,所有功劳都归功于“rebelCoder”(https://www.youtube.com/user/JurisL85) and "Alan D Moore Codes" (https://www.youtube.com/channel/UCj7i-mmOjLV17YTPIrCPkog)。

第一个文件只是 DNAEngine 的 运行 方法 class(见第三个文件),第二个文件是从 QtDesigner 转换而来的 .py 文件(engine_ui 第三个文件)。我不编辑这两个文件。

第三个文件最初看起来像这样(从 rebelCoder 复制):

from engine_ui import Ui_MainWindow
import sys
from PySide2 import QtWidgets as qtw
from PySide2 import QtCore as qtc


class DNAEngine:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.app = qtw.QApplication(sys.argv)
        self.MainWindow = qtw.QMainWindow()

    def setup(self):
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self.MainWindow)

    def run(self):
        sys.exit(self.app.exec_())

    def display(self):
        self.MainWindow.show()

我现在的想法是创建一个 Ui_MainWindow 的子 class(来自转换文件的 class),理论上我可以在其中添加信号,这导致这个:

from engine_ui import Ui_MainWindow
from PySide2 import QtWidgets as qtw
from PySide2 import QtCore as qtc
from PySide2 import QtGui as qtg
import sys


class DNASignal(Ui_MainWindow):
    def __init__(self, window):
        self.setupUi(window)
        # signal code starts here
        self.actionQuit.triggered.connect(self.close) # does not work
        self.actionSave.triggered.connect(self.onActionSaveTriggered)
        self.actionOpen.triggered.connect(self.onActionOpenTriggered)
        # signal code ends here

    def onActionSaveTriggered(self):
        text = self.textedit.toPlainText()
        filename, _ = qtw.QFileDialog.getSaveFileName()
        if filename:
            with open(filename, 'w') as handle:
                handle.write(text)
                self.statusBar().showMessage(f'Saved to {filename}')

    def onActionOpenTriggered(self):
        filename, _ = qtw.QFileDialog.getOpenFileName()
        if filename:
            with open(filename, 'r') as handle:
                text = handle.read()
            self.textEditInput.clear()
            self.textEditInput.insertPlainText(text)
            self.textEditInput.moveCursor(qtg.QTextCursor.Start)
            self.statusBar().showMessage(f'Editing {filename}')


class DNAEngine:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.app = qtw.QApplication(sys.argv)
        self.MainWindow = qtw.QMainWindow()

    def setup(self):
        self.ui = DNASignal(self.MainWindow)

    def run(self):
        sys.exit(self.app.exec_())

    def display(self):
        self.MainWindow.show()

我正在尝试连接菜单栏的三个操作,一个退出、保存和打开按钮。虽然打开和保存操作完美无缺,但退出操作不起作用。当我在没有注释掉退出信号的情况下启动应用程序时,它会抛出此错误:

AttributeError: 'DNASignal' 对象没有属性 'close'

如何让退出操作生效?

此外,虽然这种方法似乎适用于其他操作,但它非常混乱并且肯定不是最优的,那么如何优化呢?但是,我想单独保留第一个文件(运行 DNAEngine class)。

Subclass“表单 class”(从 ui 创建的表单)毫无意义,因为它只是一个 python class它自己几乎什么都不做。
您需要的是实现您正在使用的 QWidget(在您的情况下为 QMainWindow)提供的方法,因此您需要从 both 继承小部件 and 形式 classes:

class DNAMainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        # ...


class DNAEngine:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.app = qtw.QApplication(sys.argv)

    def setup(self):
        self.mainWindow = DNAMainWindow()

    def display(self):
        self.mainWindow.show()