使用 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()
感谢阅读!
问题通常是,当使用来自 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()