我用 Qt-designer 制作了 MainWindow 和 Dialog。MainWindow 和 Dialog 有一個 QPushButton。單擊 MainWindow 中的按鈕會禁用該按鈕并打開一個對話框視窗。當您單擊 Dialog 按鈕時,Dialog 視窗關閉并且 MainWindow 的按鈕再次被激活。
import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
from PyQt5 import uic
form_mainwindow = uic.loadUiType("dialog_mainWindow.ui")[0]
form_dialog = uic.loadUiType("Dialog__.ui")[0]
class dialog(QDialog, form_dialog) :
def __init__(self):
super(dialog, self).__init__()
self.setupUi(self)
self.closeBtn.clicked.connect(self.close)
self.closeBtn.clicked.connect(self.closeFN)
def closeFN(self):
main = mainwindow()
main.pushButton.setEnabled(True)
class mainwindow(QtWidgets.QMainWindow, form_mainwindow) :
def __init__(self):
super(mainwindow, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.dia)
def dia(self,checked):
d = dialog()
self.pushButton.setEnabled(False)
d.show()
d.exec_()
if __name__ == "__main__" :
app = QtWidgets.QApplication(sys.argv)
Window = mainwindow()
Window.show()
sys.exit(app.exec_())
這是我的代碼。但是,我的代碼是當 Dialog 視窗關閉時,MainWindow 中的按鈕不會再次被激活。為什么??
uj5u.com熱心網友回復:
您正在呼叫mainwindow()您的 dialogscloseFN方法,該方法會創建一個新的mainwindow小部件。因此,您設定為啟用的按鈕與您最初用于創建對話框的按鈕不同。您正在一個尚不可見的新視窗上設定一個按鈕,因為您從未呼叫.show()或使頂級視窗可見的類似方法,并且您也沒有保留對新視窗的參考,因此無論如何它都會被垃圾收集。
一個解決方案是讓您mainwindow連接到dialogs closebtn.clicked信號,然后可以觸發它自己的方法來設定要啟用的按鈕。
例如:
...
class dialog(QDialog) :
def __init__(self):
super(dialog, self).__init__()
...
# self.closeFN is no longer necessary
self.closeBtn.clicked.connect(self.close)
class mainwindow(QtWidgets.QMainWindow):
def __init__(self):
super(mainwindow, self).__init__()
...
self.pushButton.clicked.connect(self.dia)
def dia(self):
d = dialog()
self.pushButton.setEnabled(False)
# connect to closeBtn signal to enable the pushButton
d.closeBtn.clicked.connect(lambda: self.pushButton.setEnabled(True))
d.exec_()
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/509844.html
標籤:qtpyqt5
