40599


python3.5を使っています。pyqt5を使ってサブウィンドウからメッセージボックスを開きたいです。下が書いたコードです。

サブウィンドウで入力されたものが数値でなかった時にメッセージボックスが出るように書いたつもりです。しかし、メッセージボックスは表示されず、動作を中止してしまいます。

[code]

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    
    class MainWindow(QWidget):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    
            makeWindowButton = QPushButton("&make window")
            makeWindowButton.clicked.connect(self.makeWindow)
    
            self.label = QLabel()
            self.label.setText("default:")
    
            layout = QHBoxLayout()
            layout.addWidget(makeWindowButton)
            layout.addWidget(self.label)
            self.setLayout(layout)
    
        def makeWindow(self):
            subWindow = SubWindow(self)
            subWindow.show()
    
        # サブウィンドウから実行
        def setParam(self, param):
            self.label.setText(param)
    
    class SubWindow:
        def __init__(self, parent=None):
            self.w = QDialog(parent)
            self.parent = parent
    
            label = QLabel()
            label.setText('Sub Window')
    
            self.edit = QLineEdit()
            self.edit.setText(str(1))
    
            button = QPushButton('送信')
            button.clicked.connect(self.setParamOriginal)
    
            layout = QVBoxLayout()
            layout.addWidget(label)
            layout.addWidget(self.edit)
            layout.addWidget(button)
    
            self.w.setLayout(layout)
    
        # ここで親ウィンドウに値を渡している
        def setParamOriginal(self):
            try:
                text=float(self.edit.text())
                text=str(text)
                self.parent.setParam(self.edit.text())
            except:
                QMessageBox.about(self, "警告", "それは数字ではありません")
    
        def show(self):
            self.w.exec_()
    
    if __name__ == '__main__':
    
        app = QApplication(sys.argv)
        main_window = MainWindow()
    
        main_window.show()
        sys.exit(app.exec_())
    
[/code]


CC BY-SA 4.0
2017-12-27T14:52:48.937
40561
2021-03-09T05:01:34.360
2021-03-09T05:01:34.360
3060
26529
question
python python3 pyqt5
pyqt5でサブウィンドウからメッセージボックスが開かない


コードを書き換えた結果こうなりました。

[code]

    import sys
    from PyQt5 import QtWidgets
    #自分のコードスタイルでは、出自を明らかにしています。なので全部QtWidgetsをつけています。QtGuiとQtCoreは全く使っていないので削除しました。
    
    class MainWindow(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent=None)
    
            self.makeWindowButton = QtWidgets.QPushButton("&make window")
            self.makeWindowButton.clicked.connect(self.makeWindow)
    
            self.label = QtWidgets.QLabel()
            self.label.setText("default:")
    
            layout = QtWidgets.QHBoxLayout()
            layout.addWidget(self.makeWindowButton)
            layout.addWidget(self.label)
            self.setLayout(layout)
    
        def makeWindow(self):
            subWindow = SubWindow(self)
            subWindow.show()
    
        # サブウィンドウから実行
        def setParam(self, param):
            self.label.setText(param)
    
    class SubWindow:
        def __init__(self, parent=None):
    
            self.w = QtWidgets.QDialog(parent)
            self.parent = parent
    
            self.label = QtWidgets.QLabel()
            self.label.setText('Sub Window')
    
            self.edit = QtWidgets.QLineEdit()
            self.edit.setText(str(1))
    
            self.button = QtWidgets.QPushButton('送信')
            self.button.clicked.connect(self.setParamOriginal)
    
            layout = QtWidgets.QVBoxLayout()
            layout.addWidget(self.label)
            layout.addWidget(self.edit)
            layout.addWidget(self.button)
    
            self.w.setLayout(layout)
    
        # ここで親ウィンドウに値を渡している
        def setParamOriginal(self):
    
            try:
                text=float(self.edit.text())
                text=str(text)
                self.parent.setParam(self.edit.text())
            except:　　　　　　　　　#ここの第一引数に注目！
                QtWidgets.QMessageBox.about(self.parent, "警告", "それは数字ではありません")
    
        def show(self):
            self.w.exec_()
    def main():
        try:    
            app = QtWidgets.QApplication(sys.argv)
        except Exception as e:
            print(66,e)
        main_window = MainWindow()
        main_window.show()
        sys.exit(app.exec_())
    
    if __name__ == '__main__':
        main()
    
[/code]

わたしの環境で動くように変更したうえで、  
このようなエラーが発生しました。

[code]

    Traceback (most recent call last):
    
      File "J:/stack_overflow_question_1.pyw", line 59, in setParamOriginal
        QtWidgets.QMessageBox.about(self, "警告", "それは数字ではありません")
    
    TypeError: about(QWidget, str, str): argument 1 has unexpected type 'SubWindow'
    
[/code]

つまり、`QMessageBox`の第一引数を、`self.parent`と改めれば、コードが  
動くようになりました。この第一引数には、ウィジェットが入らなければ  
なりません。エラーメッセージにもそのように書いてありますね。  
PySideですが、こちらを参照。  
[QtGui.QMessageBox.about-](https://pyside.github.io/docs/pyside/PySide/QtGui/QMessageBox.html#PySide.QtGui.PySide.QtGui.QMessageBox.about)  
`SubWindow`クラスは、何らウィジェット系のクラスを継承して  
いませんから、`self`をそのまま指定すると、ウィジェットではないものが  
第一引数に入れられてしまっているのです。  
そのため、`self.parent`と改めて、ウィジェット系のコードを入れれば治り  
ました。  


CC BY-SA 3.0
2017-12-29T02:41:31.870
40599
2017-12-29T06:30:06.307
2017-12-29T06:30:06.307
24284
24284
40561
answer