![](/img/trans.png)
[英]PyQt5 QScrollArea widget with dynamically created GroupBoxes
[英]pyqt5 QScrollArea inheritance
我很難理解如何在PyQt5中使用滾動條。 我可以嘗試任意布局,只是一些顏色塊。 我希望顏色的布局具有最小尺寸,並且當窗口小於該尺寸時,將出現滾動條(或者滾動條一直存在)。 我發現了這個例子:
並將其更改為與PyQt5一起使用:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QScrollArea, QVBoxLayout, QWidget
class myDialog(QDialog):
_buttons = 0
def __init__(self, parent=None):
super(myDialog, self).__init__(parent)
self.pushButton = QPushButton(self)
self.pushButton.setText("Add Button!")
self.pushButton.clicked.connect(self.on_pushButton_clicked)
self.scrollArea = QScrollArea(self)
self.scrollArea.setWidgetResizable(True)
self.scrollAreaWidgetContents = QWidget(self.scrollArea)
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 380, 247))
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.verticalLayout = QVBoxLayout(self)
self.verticalLayout.addWidget(self.pushButton)
self.verticalLayout.addWidget(self.scrollArea)
self.verticalLayoutScroll = QVBoxLayout(self.scrollAreaWidgetContents)
'''
verticalLayoutScroll is a child of scrollAreaWidgetContents
scrollAreaWidgetContents is a child of scrollArea
scrollArea is child of self
verticalLayout is also a child of self has the widgets pushButton and scrollArea
'''
@QtCore.pyqtSlot()
def on_pushButton_clicked(self):
self._buttons += 1
pustButtonName = u"Button {0}".format(self._buttons)
pushButton = QPushButton(self.scrollAreaWidgetContents)
pushButton.setText(pustButtonName)
self.verticalLayoutScroll.addWidget(pushButton)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
app.setApplicationName('myDialog')
main = myDialog()
main.show()
sys.exit(app.exec_())
這是我的代碼:
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 15 07:37:28 2018
@author: Erik
"""
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QSlider, QPushButton,
QMainWindow, QAction, qApp,
QLCDNumber, QGridLayout, QLabel, QLineEdit, QVBoxLayout, QHBoxLayout,
QSizePolicy, QScrollArea, QLayout)
from PyQt5.QtGui import QIcon, QColor, QPalette
from PyQt5.QtCore import Qt, QSize, QRect
class Color(QWidget):
def __init__(self, color, *args, **kwargs):
super(Color, self).__init__(*args, **kwargs)
self.setAutoFillBackground(True)
palette = self.palette()
palette.setColor(QPalette.Window, QColor(color))
self.setPalette(palette)
class Color2(QWidget):
def __init__(self, color, *args, **kwargs):
super(Color2, self).__init__(*args, **kwargs)
self.setAutoFillBackground(True)
palette = self.palette()
palette.setColor(QPalette.Window, QColor(color))
self.setPalette(palette)
def sizeHint(self):
return QSize(150,150)
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("My Awesome App")
size = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
layout = QVBoxLayout()
layout2 = QVBoxLayout()
brw = Color2('brown')
brw.setSizePolicy(size)
layout2.addWidget(brw)
layout2.addWidget(Color('black'))
layout2.setStretch(1,2)
layout2.addWidget(Color('cyan'))
layout2.setStretch(2, 1)
layout.addWidget(Color('red'))
layout.addWidget(Color('blue'))
layout.addWidget(Color('green'))
self.scrollArea = QScrollArea(self)
self.scrollArea.setWidgetResizable(True)
self.scrollAreaWidgetContents = QWidget(self.scrollArea)
self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 600, 500))
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.scrollAreaWidgetContents.setMinimumSize(QSize(500, 500))
self.scrollLayout = QVBoxLayout(self.scrollAreaWidgetContents)
#self.scrollLayout.setSizeConstraint(QLayout.SetMinimumSize) #2
self.mainLayout = QHBoxLayout()
self.mainLayout.addWidget(Color('purple'))
self.mainLayout.addWidget(Color('yellow'))
self.mainLayout.addWidget(Color('orange'))
self.mainLayout.addLayout(layout2)
self.mainLayout.addLayout(layout)
self.scrollLayout.addLayout(self.mainLayout)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
sys.exit(app.exec_())
我幾乎看不到scrollArea中的顏色。 在上面的第一個代碼塊中,我不理解我在注釋塊中描述的必要繼承結構。 我是否需要擴展布局類來設置最小尺寸? https://doc.qt.io/qt-5/qlayoutitem.html#minimumSize是怎樣的“大小提示和布線”的部分https://doc.qt.io/qt-5/qscrollarea.html#details相關?
謝謝。
問題是您尚未將QScrollArea
建立為centralWidget。
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("My Awesome App")
size = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
layout = QVBoxLayout()
layout2 = QVBoxLayout()
brw = Color2('brown')
brw.setSizePolicy(size)
layout2.addWidget(brw)
layout2.addWidget(Color('black'))
layout2.setStretch(1,2)
layout2.addWidget(Color('cyan'))
layout2.setStretch(2, 1)
layout.addWidget(Color('red'))
layout.addWidget(Color('blue'))
layout.addWidget(Color('green'))
self.scrollArea = QScrollArea()
# set CentralWidget
self.setCentralWidget(self.scrollArea)
self.scrollArea.setWidgetResizable(True)
self.scrollAreaWidgetContents = QWidget(self.scrollArea)
self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 600, 500))
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.scrollAreaWidgetContents.setMinimumSize(QSize(500, 500))
self.scrollLayout = QVBoxLayout(self.scrollAreaWidgetContents)
#self.scrollLayout.setSizeConstraint(QLayout.SetMinimumSize) #2
self.mainLayout = QHBoxLayout()
self.mainLayout.addWidget(Color('purple'))
self.mainLayout.addWidget(Color('yellow'))
self.mainLayout.addWidget(Color('orange'))
self.mainLayout.addLayout(layout2)
self.mainLayout.addLayout(layout)
self.scrollLayout.addLayout(self.mainLayout)
self.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.