【问题标题】:Insert a Widget into another Window将小部件插入另一个窗口
【发布时间】:2018-03-01 17:50:34
【问题描述】:

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

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

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

应该在名为“UploadArea”的 QWidget 中打开小部件,它可能像垃圾一样编码,没有任何意义,但如果你能告诉我一个优雅的答案来解决我的问题,那就太好了。

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_())

小部件和主窗口

它应该是什么样子

感谢您的帮助

伦纳德

【问题讨论】:

  • 你可以分享.ui
  • 什么是UploadArea,是QVBoxLayout,QWidget?
  • UploadArea 是一个 QWidget,这些是我的 .ui 文件:PiratePad

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


【解决方案1】:

您已经接近了 - 您可以创建 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_()

QWidget 上使用addWidget() 而不是QLayout,您可能会误会。最简单的解决方法是为您的小部件添加布局:

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

请给我们反馈,如果出现问题,请向我们展示 traceback-print

【讨论】:

  • 首先感谢您的帮助。我尝试了您的简单修复,但没有奏效,我尝试用您的 SubWidget 替换我自己的 GUI,至少 python 没有崩溃,但 UploadArea 内没有任何显示。如果我将 (SubWidget(self)) 替换为 (loadUi("my_.ui_File")),那么我一按下按钮,Python 就会崩溃
  • @Schnox 崩溃时会说什么?如果您没有收到错误消息,请在控制台中执行 main - 然后您可能会收到一些错误信息。
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多