52954


タブが3つに分かれたGUIを作った際、タブ内の関数を実行したときにウィンドウのタイトルが変化するようにしたいです。以下は試しに書いたコードです。

[code]

    import sys
    from PyQt5.QtWidgets import QWidget, QApplication
    from PyQt5.QtWidgets import QHBoxLayout, QTabWidget
    from PyQt5.QtWidgets import QRadioButton, QButtonGroup
    from PyQt5.QtWidgets import QCheckBox, QLabel, QComboBox
    from PyQt5.QtWidgets import QPushButton, QVBoxLayout
    
    
    class Widget1(QWidget):
        def __init__(self, parent=None):
            super(QWidget, self).__init__(parent)
    
            button = QPushButton('1')
            button.clicked.connect(self.buttonClicked)
            layout = QVBoxLayout()
            layout.addWidget(button)
            self.setLayout(layout)
    
        def buttonClicked(self):
            print("1")
            Main.set_WindowTitle(self)
    
    class Widget2(QWidget):
        def __init__(self, parent=None):
            super(QWidget, self).__init__(parent)
    
            button = QPushButton('2')
            button.clicked.connect(self.buttonClicked)
            layout = QVBoxLayout()
            layout.addWidget(button)
            self.setLayout(layout)
    
        def buttonClicked(self):
            print("2")
    
    class Widget3(QWidget):
        def __init__(self, parent=None):
            super(Widget3, self).__init__(parent)
    
            button = QPushButton('3')
            button.clicked.connect(self.buttonClicked)
            layout = QVBoxLayout()
            layout.addWidget(button)
            self.setLayout(layout)
    
        def buttonClicked(self):
            print("3")
    
    
    class Main(QWidget):
        def __init__(self):
            super().__init__()
    
            widget1 = Widget1(self)
            widget2 = Widget2(self)
            widget3 = Widget3(self)
    
            tab = QTabWidget()
            tab.addTab(widget1, '1')
            tab.addTab(widget2, '2')
            tab.addTab(widget3, '3')
    
            layout = QHBoxLayout(self)
            layout.addWidget(tab)
    
            self.setLayout(layout)
            self.setWindowTitle('tab')
            self.show()
    
        def set_WindowTitle(self):
            self.setWindowTitle('1')
    
        def set_WindowTitle2(self):
            self.setWindowTitle('2')
    
        def set_WindowTitle3(self):
            self.setWindowTitle('3')
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = Main()
        sys.exit(app.exec_())
    
[/code]

これを実行することで次のようなGUIが作成されます。  
[![画像](https://i.stack.imgur.com/rbTRt.png)](https://i.stack.imgur.com/rbTRt.png)  
ここで、一つ目のタブのボタン1を押したときにウィンドウ全体のタイトルが「tab」から「１」になるように書いてみたつもりなのですが、実際にはボタンを押しても何も変化しません。エラーすら吐きません。どのように変えればよいのでしょうか。


CC BY-SA 4.0
2019-02-22T17:59:10.687
52952
2019-02-22T22:25:58.133
2019-02-22T22:19:52.727
19110
26529
question
python python3 pyqt5
pyqt5で別のクラスの関数を実行するのがうまくいかない


`Main.set_WindowTitle('...')`ではなく、そのインスタンスである`win`の`setWindowTitle('...')`を呼ぶ必要があると思います。

`Widget1`,`Widget2`,`Widget3`で、コンストラクタに渡されている`parent`が`win`に当たるので、インスタンス変数として保持して、`buttonClicked()`内で呼び出せばよいと思います。

[code]

    # 変更例(Widget1のみ)
    class Widget1(QWidget):
        def __init__(self, parent=None):
            super(QWidget, self).__init__(parent)
    
            self.win = parent
    
            button = QPushButton('1')
            button.clicked.connect(self.buttonClicked)
            layout = QVBoxLayout()
            layout.addWidget(button)
            self.setLayout(layout)
    
        def buttonClicked(self):
            print("1")
            self.win.set_WindowTitle(self)
    
[/code]


CC BY-SA 4.0
2019-02-22T22:25:58.133
52954
2019-02-22T22:25:58.133
20098
52952
answer