【问题标题】:How to get self.close to work, when using Qt designer? [duplicate]使用 Qt 设计器时如何让 self.close 工作? [复制]
【发布时间】:2021-05-22 11:35:50
【问题描述】:

感谢阅读!

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

第一个文件只是运行 DNAEngine 类的方法(见第三个文件),第二个文件是从 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 的子类(转换后的文件中的类),理论上我可以在其中添加信号,这会导致:

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

我正在尝试连接菜单栏的三个操作,即退出、保存和打开按钮。虽然打开和保存操作可以正常工作,但退出操作不起作用。当我在没有注释 Quit 信号的情况下启动应用程序时,它会引发此错误:

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

如何让退出操作生效?

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

【问题讨论】:

    标签: python pyqt qt-designer pyside2


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多