簡體   English   中英

PyQt5中動態添加的Widgets

[英]Dynamically added Widgets in PyQt5

我是 PyQt 的新手,我正在嘗試創建一個系統,當用戶按下搜索按鈕時,它會動態添加小部件。 添加的項目應該用於顯示搜索結果。 但是,添加的項目被包裹在某個矩形中,而不是增加布局的大小。

我的代碼如下:

ui_test.py(Qt 設計師制作)

# -*- 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"))

主要文件:

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

主要問題是您正在創建一個小部件作為滾動區域的直接子級,而實際的可滾動小部件已經存在,因為它是由 Designer 創建的: self.scrollAreaWidgetContents

因此,只需為此創建主布局,不需要進一步的容器小部件(刪除main_widget ):

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

請注意,您還需要為主要的 window(或者,准確地說,它的中央小部件)正確設置主布局,否則當 window 調整大小時,其他內容將無法正確調整大小。 右鍵單擊主要 window 任何小部件之外的空白區域,然后 select 從“布局”菜單中選擇適當的布局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM