将窗口小部件插入另一个窗口

时间:2018-03-01 17:50:35

标签: python python-3.x pyqt pyqt5 qt-designer

我用谷歌搜索了很长时间,我无法找到解决问题的方法。

我正在尝试创建一个窗口,您可以在其中显示另一个窗口小部件的多个实例,就像您在图片中看到的那样。小部件应该是您可以使用它们管理的不同上传。这是我写的代码和

self.UploadArea.addWidget(uic.loadUi('gui_files/module.ui'))

应该打开一个名为“UploadArea”的QWidget中的Widget,它可能被编码为垃圾并没有任何意义,但如果你能告诉我一个优雅的答案我会很好。

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args):
        super(MainWindow, self).__init__(*args)
        uic.loadUi('gui_files/mainWindow.ui', self)

        self.upload.clicked.connect(self.buttonClicked)

    def buttonClicked(self):
        print("Test")
        self.UploadArea.addWidget(uic.loadUi('gui_files/module.ui'))


app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

Widget和MainWindow

它应该如何看待

感谢您的帮助

的Lennard

1 个答案:

答案 0 :(得分:0)

您已接近 - 您可以创建QWidget的多个实例,然后将这些实例添加到QMainWindow。这是一个最小的工作示例:

from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi

class SubWidget( QWidget ) :
    def __init__ ( self, parent = None ) :
        super( SubWidget, self ).__init__( parent )
        button = QPushButton( 'toggle' )
        checkbox = QCheckBox( 'check' )
        button.clicked.connect( checkbox.toggle )
        hLayout = QHBoxLayout( self )
        hLayout.addWidget( button )
        hLayout.addWidget( checkbox )
        self.setLayout( hLayout )

class Window( QMainWindow ) :
    def __init__ ( self, parent = None ) :
        super( Window, self ).__init__( parent )
        # loadUi( 'main-something.ui', self )
        button = QPushButton( 'add' )
        button.clicked.connect( self.add )
        self.vLayout = QVBoxLayout( self )
        self.vLayout.addWidget( button )
        centralWidget = QWidget()
        centralWidget.setLayout( self.vLayout )
        self.setCentralWidget( centralWidget )

    def add ( self ) :
        self.vLayout.addWidget( SubWidget( self ) )
        # self.vLayout.addWidget( loadUi( 'sub-something.ui', self ) )

if __name__ == "__main__" :
    app = QApplication( [] )
    w = Window()
    w.show()
    app.exec_()

您在addWidget()而不是QWidget上使用QLayout时会误认为是错误的。最容易修复的部分是,为您的小部件添加布局:

 vLayout = QVBoxLayout ()
 UploadArea.setLayout( vLayout )
 vLayout.addWidget( loadUi( 'your_file.ui' ) )

请向我们提供反馈意见,如果出现问题,请告诉我们traceback-print