[英]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.