1

PyQTに別の問題があります。今回は、コードの一部が含まれているため、はるかに便利な例があります(もちろん、削除されています)。「PROGRAMSELECT」ダイアログウィンドウを閉じる方法を理解するのに苦労しています。 「LOGOUT」ボタンのみを使用します。フォームの閉じるボタンを使用することもできますが、「ログアウト」ボタンを使用して実行したいと思います。

誰かが私がこの難問を解決するのを手伝ってもらえますか?

これがあなた方全員が噛むためのいくつかのコンパイル可能なコードです。

connectionName = 'example'

class SelectProgramForm(QtGui.QDialog):   
    def __init__(self, connName, connPrivilege):
        QtGui.QWidget.__init__(self)
        self.fooA = connName
        self.fooB = connPrivilege

        self.widgetWidth = 100
        self.formWidth = self.widgetWidth + 40

    def setupUi(self, programSelectForm):
        programSelectForm.setObjectName("programSelectForm")
        programSelectForm.resize(400, self.formWidth)
        self.widget = QtGui.QWidget(programSelectForm)
        self.widget.setGeometry(QtCore.QRect(20, 20, 360, self.widgetWidth))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtGui.QVBoxLayout(self.widget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.instructionLabel = QtGui.QLabel(self.widget)
        self.instructionLabel.setObjectName("instructionLabel")
        self.verticalLayout.addWidget(self.instructionLabel)
        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.optionsGridLayout = QtGui.QGridLayout()
        self.optionsGridLayout.setObjectName("optionsGridLayout")


        self.verticalLayout.addLayout(self.optionsGridLayout)
        spacerItemUpper = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItemUpper)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItemLower = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItemLower)
        self.pushButtonLogout = QtGui.QPushButton(self.widget)
        self.pushButtonLogout.setObjectName("pushButtonLogout")
        self.horizontalLayout.addWidget(self.pushButtonLogout)
        self.verticalLayout.addLayout(self.horizontalLayout)

        self.connect(self.pushButtonLogout, QtCore.SIGNAL("clicked()"), self.reject)

        self.retranslateUi(programSelectForm)
        QtCore.QMetaObject.connectSlotsByName(programSelectForm)


    def retranslateUi(self, programSelectForm):
        programSelectForm.setWindowTitle(QtGui.QApplication.translate("programSelectForm", "Program Select", None, QtGui.QApplication.UnicodeUTF8))
        self.instructionLabel.setText(QtGui.QApplication.translate("programSelectForm", "Select the program that you wish to access:", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButtonLogout.setText(QtGui.QApplication.translate("programSelectForm", "Logout", None, QtGui.QApplication.UnicodeUTF8))


class LoginForm(QtGui.QDialog): 
    def __init__(self, connName):
        self.fooA = connName

    def setupUi(self, LoginForm):
        LoginForm.setObjectName("LoginForm")
        LoginForm.resize(275, 175)
        self.widget = QtGui.QWidget(LoginForm)
        self.widget.setGeometry(QtCore.QRect(10, 10, 251, 147))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtGui.QVBoxLayout(self.widget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.dataInputLayout = QtGui.QHBoxLayout()
        self.dataInputLayout.setObjectName("dataInputLayout")
        self.labelVerticalLayout = QtGui.QVBoxLayout()
        self.labelVerticalLayout.setObjectName("labelVerticalLayout")
        self.userIDLabel = QtGui.QLabel(self.widget)
        self.userIDLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.userIDLabel.setObjectName("userIDLabel")
        self.labelVerticalLayout.addWidget(self.userIDLabel)
        self.passwordLabel = QtGui.QLabel(self.widget)
        self.passwordLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.passwordLabel.setObjectName("passwordLabel")
        self.labelVerticalLayout.addWidget(self.passwordLabel)
        self.dataInputLayout.addLayout(self.labelVerticalLayout)
        self.labelButtonVerticalLayout = QtGui.QVBoxLayout()
        self.labelButtonVerticalLayout.setObjectName("labelButtonVerticalLayout")
        self.userIDLineEdit = QtGui.QLineEdit(self.widget)
        self.userIDLineEdit.setObjectName("userIDLineEdit")
        self.labelButtonVerticalLayout.addWidget(self.userIDLineEdit)
        self.passwordLineEdit = QtGui.QLineEdit(self.widget)
        self.passwordLineEdit.setObjectName("passwordLineEdit")
        self.labelButtonVerticalLayout.addWidget(self.passwordLineEdit)
        self.dataInputLayout.addLayout(self.labelButtonVerticalLayout)
        self.verticalLayout.addLayout(self.dataInputLayout)
        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.buttonLayout = QtGui.QHBoxLayout()
        self.buttonLayout.setObjectName("buttonLayout")
        self.newUserPushButton = QtGui.QPushButton(self.widget)
        self.newUserPushButton.setObjectName("newUserPushButton")
        self.buttonLayout.addWidget(self.newUserPushButton)
        self.loginPushButton = QtGui.QPushButton(self.widget)
        self.loginPushButton.setObjectName("loginPushButton")
        self.buttonLayout.addWidget(self.loginPushButton)
        self.verticalLayout.addLayout(self.buttonLayout)

        self.retranslateUi(LoginForm)
        QtCore.QMetaObject.connectSlotsByName(LoginForm)

        QtCore.QObject.connect(self.loginPushButton, QtCore.SIGNAL("clicked()"), self.confirmUser)

    def confirmUser(self):
        programWindow = QtGui.QDialog()
        self.fooA = 'fooA'   # these are needed in real program
        self.fooB = 'fooB'   # these are needed in real program
        programDialog = SelectProgramForm(self.fooA, self.fooB)
        programDialog.setupUi(programWindow)
        programWindow.exec_()

    def retranslateUi(self, LoginForm):
        LoginForm.setWindowTitle(QtGui.QApplication.translate("LoginForm", "Login", None, QtGui.QApplication.UnicodeUTF8))
        self.userIDLabel.setText(QtGui.QApplication.translate("LoginForm", "Username:", None, QtGui.QApplication.UnicodeUTF8))
        self.passwordLabel.setText(QtGui.QApplication.translate("LoginForm", "Password:", None, QtGui.QApplication.UnicodeUTF8))
        self.newUserPushButton.setText(QtGui.QApplication.translate("LoginForm", "New User?", None, QtGui.QApplication.UnicodeUTF8))
        self.loginPushButton.setText(QtGui.QApplication.translate("LoginForm", "Log In", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = QtGui.QDialog()
    newUser = LoginForm(connectionName)
    newUser.setupUi(window)
    window.show()
    sys.exit(app.exec_())

これは私が探しているものを示す別のコンパイル可能な例です。各ウィンドウを閉じることができます。ウィンドウには3つのレベルがあり、一方が他方によってアクティブ化され、2番目と3番目のウィンドウに閉じるアイコン(別名「X」ボタン)がないことに注意してください。このコードだけが他のコードで機能する場合...

'''
Created on 2010-06-18

@author: dhatt
'''

import sys
from PyQt4 import QtGui, QtCore

class WindowLV3(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setWindowFlags(QtCore.Qt.CustomizeWindowHint|QtCore.Qt.WindowTitleHint|QtCore.Qt.WindowMaximizeButtonHint)
        self.setGeometry(300, 300, 120, 150)
        self.setWindowTitle('LV3')

        quit = QtGui.QPushButton('Close', self)
        quit.setGeometry(10, 10, 60, 35)

        self.connect(quit, QtCore.SIGNAL('clicked()'),
            self.reject)


class WindowLV2(QtGui.QDialog):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.Window3 = WindowLV3()

        self.setWindowFlags(QtCore.Qt.CustomizeWindowHint|QtCore.Qt.WindowTitleHint|QtCore.Qt.WindowMaximizeButtonHint)
        self.setGeometry(300, 300, 120, 150)
        self.setWindowTitle('LV2')

        self.quit = QtGui.QPushButton('Close', self)
        self.quit.setGeometry(10, 10, 60, 35)

        next = QtGui.QPushButton('Lv3', self)
        next.setGeometry(10, 50, 60, 35)

        self.connect(self.quit, QtCore.SIGNAL('clicked()'),
            self.reject)

        self.connect(next, QtCore.SIGNAL('clicked()'),
            self.nextWindow)

    def nextWindow(self):
        self.Window3.show()


class WindowLV1(QtGui.QDialog):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.Window2 = WindowLV2()

        self.setGeometry(300, 300, 120, 150)
        self.setWindowTitle('LV1')

        next = QtGui.QPushButton('Lv2', self)
        next.setGeometry(10, 50, 60, 35)

        quit = QtGui.QPushButton('Close', self)
        quit.setGeometry(10, 10, 60, 35)

        self.connect(next, QtCore.SIGNAL('clicked()'),
            self.nextWindow)

        self.connect(quit, QtCore.SIGNAL('clicked()'),
             self.reject)
        #QtGui.qApp, QtCore.SLOT('quit()'))

    def nextWindow(self):
        self.Window2.show()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    Window1 = WindowLV1()
    Window1.show()
    sys.exit(app.exec_())

ハッピーハンティング!

4

3 に答える 3

0

私はあなたの以前の質問に答えました。ここでの解決策は同じです、単に置き換える

self.connect(self.pushButtonLogout, QtCore.SIGNAL("clicked()"), self.reject)

self.connect(self.pushButtonLogout, QtCore.SIGNAL("clicked()"), self.close)

これでダイアログが閉じます。

于 2010-06-19T06:51:45.360 に答える
0

私は実際にコードを実行しませんでしたが、エラーから、ローカルオブジェクトにアクセスしようとしているようです。

次のコードが問題になる可能性があります。

def confirmUser(self):
        programWindow = QtGui.QDialog()
        self.fooA = 'fooA'   # these are needed in real program
        self.fooB = 'fooB'   # these are needed in real program
        programDialog = SelectProgramForm(self.fooA, self.fooB)
        programDialog.setupUi(programWindow)
        programWindow.exec_()

ここには2つの可能性があります。1)programWindowインスタンス変数として作成します。すなわち作るself.programWindow = QtGui.QDialog()

2)理想的には、の単一のインスタンスを作成する必要があり、ここself.programWindowで呼び出すことができself.programWindow.show()ます。つまり、のコードの一部をconfirmUser初期化メソッドに移動できます。しかし、私は実際にあなたのコードを深く研究して「これは正しい方法です」と言っていませんでした...ただ試してみてください。

于 2010-06-26T08:09:03.657 に答える
0

私は再びここにいます、そして私はなんとか答えをかき集めました。

ギアを切り替えて、代わりにQWizardを使用してみましたが、QWizardでもダイアログと同じ問題が発生した場合(RuntimeError:基になるC / C ++オブジェクトが削除されました)、コードをもう一度確認しました。これを見つけました。

ダイアログだけを使用して、最終的にフォームを閉じる方法を見つけました。LoginFormは、実際にはウィンドウとオブジェクト自体の2つのオブジェクト(実際のQDialogオブジェクトではない)であるため、QDialogとして正しく設定されていませんでした。

前のコード:

# a QDialog inside a LoginForm object (as a QDialog class), if I close this, the 'window' QDialog object is left hanging and raises an error
window = QtGui.QDialog()
newUser = LoginForm(connectionName)
newUser.setupUi(window)
window.show() code here

後のコード:

# a LoginForm object as a QDialog class.  When closed, nothing is left hanging
window = LoginForm(connectionName)
window.setupUi(window)
window.show()

これに、LoginFormクラス自体の複数の行を変更する作業(つまり、LoginFormクラスからSetupUIメソッドを完全にリファクタリングする作業)を追加します。

そして、これをクラス自体(LoginFormクラス)に追加します

class LoginForm(QtGui.QDialog):
"""
This makes the LoginForm object subclassed from a QDialog object.
"""

def __init__(self, parent, fooA, fooB):
    super(LoginForm, self).__init__(parent)
    # Add whatever code you want afterwards

これは最善の方法ではないかもしれませんが、それは私がそれを行うことができた方法であり、SetupUIがQtDesignerから私のために設定したすべての混乱なしに私のコードはよりクリーンであることがわかりました。

于 2010-07-14T03:40:45.977 に答える