まず、私はPyQtの完全な初心者です。
関数をメインウィンドウの閉じるボタン(ウィンドウの隅にある赤いx)にリンクしようとしましたが、うまくいきませんでした。今のところ、私のコードは次のようになっています。
class Ui_MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
def setupUi(self, MainWindow):
#setup code goes here
def retranslateUi(self, MainWindow):
#re translation of the GUI code
def closeEvent(self, event):
print "User has clicked the red x on the main window"
別の「メイン」ファイルには、次のものがあります。
class GUIForm(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self,parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
#self.ui.ECUStatus_txt = MyWidget.__init__.text_list
self.threadData()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = GUIForm()
myapp.show()
ret = app.exec_()
sys.exit(ret)
ただし、コマンドプロンプトで実行すると、赤いxを押したときにprintステートメントが表示されません。私はQtに不慣れであることを知っていますが、かなりの数の人々がこの質問をするのを見てきました。そして、答えのどれもすでに上に書かれていることを超えていないようでした。
これらのソリューションは両方とも私のものと似ていますが、それでも機能しません
そのユーザーの特定のコードで機能したかもしれない答えにもかかわらず、私の仲間のPyQtの同僚と私は、私たちの同僚が機能していない理由についてまだかなり霧がかかっています。 PyQtに組み込まれている「RedXbox」のボタン名は定義されていますか?他のボタンの場合と同じように、別の機能に接続できますか?
Uiファイルから生成されたクラスを変更しないでください。代わりに、サブクラスを作成してサブクラスを変更する必要があります。
コードの外観から、実際には2つのQMainWindow
sを作成していて、closeEventが間違ったもの(おそらく1つは非表示になっていますか?)に対してキャッチされています。つまり、_self.ui
_は表示されていないQMainWindow
であり、GUIForm
のUIに追加されていません。代わりに、Ui_MainWindow.setupUi()
メソッドを明示的に使用して、ウィジェットを独自のQMainWindow
、 'GUIForm`に追加します。
代わりに、_Ui_MainWindow
_クラスをuiファイルから生成されたときの状態のままにして、メインのpythonファイルを次のように変更する必要があります。
_class GUIForm(Ui_MainWindow):
def __init__(self, parent=None):
Ui_MainWindow.__init__(self, parent)
self.threadData()
def closeEvent(self, event):
print "User has clicked the red x on the main window"
event.accept()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = GUIForm()
myapp.show()
ret = app.exec_()
sys.exit(ret)
_
このようにして、自動生成されたUIファイルの動作を拡張します。これにより、コードを再追加することなく、.uiファイルからpythonファイルを簡単に再生成できます(これが、自動生成されたPythonファイル)
メインウィンドウからイベント信号を処理するときに問題が発生することがあります。
あなたはコードを使うことができます:
app.aboutToQuit.connect(self.closeEvent)
closeEvent関数で独自のコードを記述できます。
注:
appはQtGui.QApplicationインスタンス
これが完全なコードのデモです:
from PyQt4 import QtCore, QtGui
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
#{================================
app.aboutToQuit.connect(self.closeEvent)
#}================================
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle('Demo')
#{================================
def closeEvent(self):
#Your desired functionality here
print('Close button pressed')
import sys
sys.exit(0)
#}================================
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
それが役に立てば幸い。