代码之家  ›  专栏  ›  技术社区  ›  Pygmalion

如何从QWidget返回值

  •  2
  • Pygmalion  · 技术社区  · 6 年前

    另外,有没有更优雅的方式来显示不同标题的同一个QWidget?

    中全景:

    import sys
    from PyQt5 import QtGui, QtCore, QtWidgets
    
    class MainWindow(QtWidgets.QWidget):
        def __init__(self,val):
            self.val=val
            super(MainWindow, self).__init__()
            self.initUI()
    
        def initUI(self):
            self.End= QtWidgets.QPushButton('OK', self)
            self.End.clicked.connect(self.end)
    
            MainLayout = QtWidgets.QVBoxLayout()
            MainLayout.addWidget(self.End)
            self.setLayout(MainLayout)
            self.setWindowTitle(str(self.val))
            self.show()
    
        def end(self):
            # return self.val+1
            self.close()
    
    def main(): 
        app = QtWidgets.QApplication(sys.argv)
    
        for i in range(10):
            ex = MainWindow(i)
            ex.show()
            res = app.exec_()
            print(res)
        sys.exit()
    
    if __name__ == '__main__':
        main()
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   eyllanesc Yonghwan Shin    6 年前

    QDialog ,以防止在使用 exec_() :

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Dialog(QtWidgets.QDialog):
        def __init__(self, val, parent=None):
            super(Dialog, self).__init__(parent)
            self.val = val
            self.initUI()
    
        def initUI(self):
            endButton = QtWidgets.QPushButton('OK')
            endButton.clicked.connect(self.on_clicked)
            lay = QtWidgets.QVBoxLayout(self)
            lay.addWidget(endButton)
            self.setWindowTitle(str(self.val))
    
        @QtCore.pyqtSlot()
        def on_clicked(self):
            self.val += 1
            self.accept()
    
    def main(): 
        app = QtWidgets.QApplication(sys.argv)
        for i in range(10):
            ex = Dialog(i)
            ex.setAttribute(QtCore.Qt.WA_DeleteOnClose)
            if ex.exec_() == QtWidgets.QDialog.Accepted:
                print(ex.val)
    
    if __name__ == '__main__':
        main()
    
        2
  •  0
  •   rbaleksandar    6 年前

    现在还不清楚你的意图是什么。如果 val 应该是一个计数器 MainWindow 实例,则必须将其声明为静态:

    class MainWindow(QtWidgets.QWidget):
        val = 0
        def __init__(self):
            super(MainWindow, self).__init__()
            MainWindow.val += 1
            self.initUI()
    
        def initUI(self):
            # ...
            self.setWindowTitle(str(MainWindow.val))
            # ...
    
    def main():
        # ...
        for i in range(10):
            ex = MainWindow()
            # ...
        # ...
    

    QWidget::setWindowTitle() 所以我觉得没什么问题。

    如果你真的想让它成为一个非静态的类成员 主窗口 使用它作为某种ID,您可以轻松地在 ex.show() :

    def main(): 
        app = QtWidgets.QApplication(sys.argv)
    
        for i in range(10):
            ex = MainWindow()
            ex.show()
            print(MainWindow.val)
            res = app.exec_()
            print(res)
        sys.exit()
    

    仅仅因为你关闭了一个小部件并不意味着你已经销毁了它,所以调用存储在对象中的值不是问题。

    不过看来你不熟悉什么 QApplication::exec() exit() 瓦尔 关闭小部件后,您可以简单地覆盖 closeEvent QObject 实例并相互连接 主窗口 实例的自定义关闭信号发送到一个插槽,并对该值执行任何您想执行的操作。