简体   繁体   中英

Dynamically added Widgets in PyQt5

I'm new to PyQt and I'm trying to create a system which dynamically adds widgets when the user presses the search button. The items added were supposed to be used to display search bresults. However, the items added were wrapped in a certain rectangle instead of growing the size of the layout.

My code was as below:

Ui_test.py(Created by Qt Designer)

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Learnnote(object):
    def setupUi(self, Learnnote):
        Learnnote.setObjectName("Learnnote")
        Learnnote.setEnabled(True)
        Learnnote.resize(524, 345)
        self.centralwidget = QtWidgets.QWidget(Learnnote)
        self.centralwidget.setObjectName("centralwidget")
        self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
        self.scrollArea.setGeometry(QtCore.QRect(10, 50, 491, 241))
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setObjectName("scrollArea")
        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 489, 239))
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.pushButton_Search = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_Search.setGeometry(QtCore.QRect(10, 0, 141, 41))
        self.pushButton_Search.setObjectName("pushButton_Search")
        Learnnote.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(Learnnote)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 524, 22))
        self.menubar.setObjectName("menubar")
        Learnnote.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(Learnnote)
        self.statusbar.setObjectName("statusbar")
        Learnnote.setStatusBar(self.statusbar)

        self.retranslateUi(Learnnote)
        self.pushButton_Search.clicked.connect(self.pushButton_Search_click)
        QtCore.QMetaObject.connectSlotsByName(Learnnote)

    def retranslateUi(self, Learnnote):
        _translate = QtCore.QCoreApplication.translate
        Learnnote.setWindowTitle(_translate("Learnnote", "MainWindow"))
        self.pushButton_Search.setText(_translate("Learnnote", "Search"))

main.py:

from PyQt5.QtWidgets import QApplication,QMainWindow
from Ui_test import Ui_Learnnote
from PyQt5 import QtWidgets
import sys

class ExampleWidget(QtWidgets.QGroupBox):
    def __init__(self, numAddWidget):
        QtWidgets.QGroupBox.__init__(self)
        self.numAddWidget = numAddWidget
        self.numAddItem   = 1
        self.setTitle("Title {}".format(self.numAddWidget)) 
        self.initSubject()
        self.organize()
    def initSubject(self):
        self.lblName = QtWidgets.QLabel("Label Title {}".format(self.numAddWidget), self)
    def organize(self):
        grid = QtWidgets.QGridLayout(self)
        self.setLayout(grid)
        grid.addWidget(self.lblName, 0, 0, 1, 3)


class MyWindow(QMainWindow,Ui_Learnnote):
    def __init__(self, parent=None):
        super(MyWindow,self).__init__(parent)
        self.setupUi(self)
        self.scrollArea.setWidgetResizable(True)
        self.numAddWidget = 1
        self.widget = ExampleWidget(self.numAddWidget)
        self.main_layout = QtWidgets.QVBoxLayout()
        self.main_layout.addWidget(self.widget)
        main_widget = QtWidgets.QWidget(self.scrollArea)
        main_widget.setLayout(self.main_layout)


    def pushButton_Search_click(self):
        self.numAddWidget += 1
        self.widget = ExampleWidget(self.numAddWidget)
        self.main_layout.addWidget(self.widget)
if __name__=="__main__":
    app=QApplication(sys.argv)
    myWin = MyWindow()
    myWin.show()
    sys.exit(app.exec_())

There main problem is that you're creating a widget as direct child of the scroll area, while the actual scrollable widget already exists as it's been created by Designer: self.scrollAreaWidgetContents .

So, just create the main layout for that, and no further container widget is necessary (remove main_widget ):

self.main_layout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)

Note that you also need to properly set a main layout for the main window (or, to be precise, its central widget ), otherwise the other contents won't resize properly when the window is resized. Right click on an empty area of the main window, outside of any widget, and select a proper layout from the "Lay out" menu.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM