我有一个QScrollArea小部件,它从空开始;

它有一个垂直布局,一个QGridLayout和一个垂直间隔,以保持在顶部,并防止它在整个滚动区域上伸展;

在程序的其他地方,有一个QTextEdit,当它被改变时,其内容扫描"种类"元素,然后它们被添加到QGridLayout.已经除去的任何物种元素也被除去.这个位有效;

我一直打开垂直滚动条,所以当它出现时它不会位于那里的其他东西之上.请注意,尽管不需要,滚动条已经大于滚动框.
这就是问题.滚动区域似乎是预设的,我无法更改它.如果我向QGridLayout添加更多行,则滚动区域的大小不会增加.
相反,它保持相同的大小,并挤压QGridLayout,使它看起来很丑陋(起初);

然后添加更多它变得无法使用;

请注意,滚动条仍然与之前的图像大小相同.前两个图像来自Qt Designer,后续的3个来自程序运行.
如果我调整窗口大小以使QScrollArea增长,那么我看到:

指示滚动区域内的某些布局未正确调整大小.
我的问题是; 当我在QGridLayout中添加和删除时,我需要做什么才能使窗口小部件的可滚动区域动态调整大小?
我在QScrollArea中有一个带有几个QSpinBox对象的控件.滚动区域滚动时,一切正常,除非鼠标碰巧超过其中一个QSpinBox.然后QSpinBox窃取焦点,轮子事件操纵旋转框值而不是滚动滚动区域.
我不想完全禁用鼠标滚轮来操纵QSpinBox,但我只想让用户明确点击或标签进入QSpinBox.有没有办法阻止QSpinBox从QScrollArea窃取焦点?
正如在下面的答案的注释中所述,设置Qt :: StrongFocus确实会阻止焦点rect出现在控件上,但它仍然会窃取鼠标滚轮并调整旋转框中的值并停止QScrollArea滚动.与Qt :: ClickFocus相同.
我有一个QScrollArea包含一个带有QVBoxLayout的小部件.在这个布局中有几个其他小部件.我希望用户能够拖动这些小部件的下边框以在垂直方向上调整它们的大小.当它们被调整大小时,我不希望它们从滚动区域中的其他小部件"窃取"大小; 相反,我希望整个滚动的"页面"改变其大小.因此,如果您放大其中一个小部件,它应该将其他小部件向下推(在滚动区域的视口之外); 如果你收缩它,它应该拉其他小部件.拖动一个窗口小部件的边框不应该更改垂直滚动中任何其他窗口小部件的大小; 它应该只是移动它们.
我开始使用QSplitter.如果我使用它,我可以拖动来改变小部件的大小,但似乎没有办法让它像上面描述的那样"推/拉"其他小部件,而不是增长/缩小它们.但我找不到任何其他方法来给小部件一个可拖动的句柄,这将允许我改变它的大小.我怎么能做到这一点?
这是我正在做的一个简单的例子.(在这个例子中,我已经注释掉了分割器,但是如果你取消注释它,你可以看到该版本会发生什么.)
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.Qsci import QsciScintilla, QsciLexerPython
class SimplePythonEditor(QsciScintilla):
def __init__(self, parent=None):
super(SimplePythonEditor, self).__init__(parent)
self.setMinimumHeight(50)
class Chunk(QFrame):
def __init__(self, parent=None):
super(Chunk, self).__init__(parent)
layout = QVBoxLayout(self)
sash = QSplitter(self)
layout.addWidget(sash)
sash.setOrientation(Qt.Vertical)
editor = self.editor = SimplePythonEditor()
output = self.output = SimplePythonEditor()
output.setReadOnly(True)
sash.addWidget(editor)
sash.addWidget(output)
self.setLayout(layout)
print(self.sizePolicy())
class Widget(QWidget):
def __init__(self, parent= None):
global inout
super(Widget, self).__init__()
#Container Widget
widget = QWidget()
#Layout of Container Widget
layout = …Run Code Online (Sandbox Code Playgroud) 我认为在 PyQt 中创建可滚动窗口应该更容易。我有一个超出窗口的标签列表,我想向下滚动以查看它们。目前,代码没有给我错误,但窗口没有出现:
class Example(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout()
lbl_arr = makeLabelArr()
for i in range(1,8):
qb = lbl_arr[i]
# qb.setFixedWidth(300)
layout.addWidget(qb)
layout.setAlignment(Qt.AlignTop)
scroll = QScrollArea()
scroll.setWidget(self)
scroll.setWidgetResizable(True)
scroll.setFixedHeight(400)
layout.addWidget(scroll)
self.setLayout(layout)
self.setGeometry(0, 0, 600, 220)
self.setWindowTitle('SnP watchlist')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
#print(QDesktopWidget().availableGeometry())
ex = Example()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud) 我有QHBoxLayout我的形式添加到它3点的布局上.第二个有关于我的问题的项目.
我有一个QVBoxLayout在主要布局的第二个窗格(QHBoxLayout).这QVBoxLayout有一个QScrollArea补充addWidget.
这QScrollArea是一个QWidget名为"scrollContents"的父级,后者又包含一个QGridLayout.
我正在为此添加一个自定义创建的小部件,QGridLayout它具有固定的高度.我们100px现在可以考虑这个问题.
如果这个QGridLayout项目的总高度小于表单本身,则它们将这些小部件垂直居中,并在它们之间留出相同的空间.
如果只有一个小部件,它就会出现在中间.但我希望它们从上到下列出.
例:[###代表的区域QScrollArea中,有一个QWidget用了 QGridLayout.
OK -> DESIRED -> NOT DESIRED AND WHAT HAPPENS
########## ########## ##########
# |item| # # |item| # # #
# |item| # # # # #
# |item| # # # # #
# |item| # # # # |item| # …Run Code Online (Sandbox Code Playgroud) 如何隐藏滚动条QScrollArea?目前我hide()在返回的滚动条上使用该方法QScrollArea::horizontalScrollBar(),QScrollArea::verticalScrollBar()但是为滚动条保留的空间仍然存在.显然这看起来非常丑陋并且不节省空间.如果我完全删除滚动条,我就不能再使用滚动到特定点了QScrollBar::setValue().
我正在使用PyQt5实现一个python应用程序,在使用QScrollArea时遇到了一些问题.这是我的应用程序的布局:
它由2个QScrollArea(左右窗格)和一个QMdiArea(中心小部件)组成QHBoxLayout.当我通过点击控制展开左侧窗格中的小部件,以及的高度QWidget的QScrollArea比,则高度更大的QScrollArea本身,会出现滚动条(如预期),但它重叠的内容QScrollArea.为了解决这个问题,我重新实现了resizeEvent为滚动条添加必要的空间(直到这一切都有效.
现在,当我手动调整主窗口的大小时,左侧窗格会获得更多空间,滚动条应该消失(但它没有)并且它与窗格的小部件重叠:
我还尝试手动切换滚动条的可见性(当收到resizeEvent时):当我这样做时,我可以成功隐藏滚动条但是我无法再显示它(无论我setVisible(True)是否在滚动条上调用).这会导致添加滚动条的空间,但缺少滚动条,并且窗格的内容不可滚动:
以下是窗格小部件的实现:
class Pane(QScrollArea):
MinWidth = 186
def __init__(self, alignment=0, parent=None):
super().__init__(parent)
self.mainWidget = QWidget(self)
self.mainLayout = QVBoxLayout(self.mainWidget)
self.mainLayout.setAlignment(alignment)
self.mainLayout.setContentsMargins(0, 0, 0, 0)
self.mainLayout.setSpacing(0)
self.setContentsMargins(0, 0, 0, 0)
self.setFrameStyle(QFrame.NoFrame)
self.setFixedWidth(Pane.MinWidth)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Ignored)
self.setWidgetResizable(True)
self.setWidget(self.mainWidget)
def resizeEvent(self, resizeEvent):
if self.viewport().height() < self.widget().height():
self.setFixedWidth(Pane.MinWidth + 18)
# THIS DOESN'T WORK
#self.verticalScrollBar().show()
else:
self.setFixedWidth(Pane.MinWidth)
#self.verticalScrollBar().hide()
def addWidget(self, widget):
self.mainLayout.addWidget(widget)
def …Run Code Online (Sandbox Code Playgroud) 我的小部件的结构是:
QWidget被定制为具有圆形边框的面板.
要在边框内包含带有滚动条的区域,请将其放入内部:
带有QVBoxLayout的QScrollArea(垂直添加内容)
然后我在里面添加了一系列:
标题为间距为0的QGroupBox和一个QFormLayout
formlayout不像我想的那样工作.里面的小部件是标签+旋转盒,所有这些都是.
这是一张图片:

第一.他们没有居中.我不知道为什么.
第二.正如我告诉他们的那样,它们都被赋予相同的固定尺寸,但无论如何它们都被堆积,而不是被压扁,所以它们互相隐藏.为什么它不会保持这个大小,父QScrollArea显示外面的滚动条?这就是我想要的.
我不希望内容被压扁或拉伸.我希望他们能够登顶.如果屏幕非常大,面板将很长,但内容将位于顶部,总是具有相同的大小.
有人要求代码,所以我在这里复制,但代码真的很大......我认为这更令人困惑.但好吧,生病了删除没有任何意义的行.以下是您在该框中看到的部分:
// THE PANEL OUTSIDE (A QWIDGET) is mainParametersLayout_. This particular scroll bar inside
// is cameraModeParametersPanel_
cameraModeParametersPanel_ = new QScrollArea();
cameraModeParametersPanel_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
cameraModeParametersPanel_->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
mainParametersLayout_->addWidget( cameraModeParametersPanel_ );
// HERE THERE ARE TWO MORE QGROUP BOXES. THE ONE THAT DOESN´T STAY THE WAY I SHOWED IS THIS.
QVBoxLayout* mainCameraLayout = new QVBoxLayout(cameraModeParametersPanel_);
mainCameraLayout->setSpacing(5);
// GROUP BOX
QGroupBox* activeCameraParametersGroup = new QGroupBox();
activeCameraParametersGroup->setObjectName( parametersContainerName );
activeCameraParametersGroup->setTitle(strings->cameraModeCameraParamsTitle);
mainCameraLayout->addWidget( activeCameraParametersGroup );
// LAYOUT
QFormLayout* …Run Code Online (Sandbox Code Playgroud) 我的设置如下所示:
Main Window
|- QHBoxLayout
|- Some Widgets
|- QScrollArea
| |- QHBoxLayout
| |- QGridLayout
| |- Widgets dynamically loaded in at runtime
| |- QVBoxLayout
|- Some Widgets
Run Code Online (Sandbox Code Playgroud)
添加小部件后,我希望滚动区域完全向下滚动。我这样做了:
this->ui->gridLayout_table->addWidget(/*Widget*/); // this works perfectly nice
this->ui->gridLayout_table->addWidget(/*Widget*/); // this also works perfectly nice
this->ui->scrollArea->verticalScrollBar()->setValue(this->ui->scrollArea->verticalScrollBar()->maximum());
Run Code Online (Sandbox Code Playgroud)
在最后一个命令中,它滚动到最大值减去新添加的小部件的高度。有没有办法在滚动之前刷新更改?
提前致谢 卢卡斯
QGroupBox一旦它高于400px,我试图使我的可滚动.QGroupBox使用for循环生成其中的内容.这是如何完成的一个例子.
mygroupbox = QtGui.QGroupBox('this is my groupbox')
myform = QtGui.QFormLayout()
labellist = []
combolist = []
for i in range(val):
labellist.append(QtGui.QLabel('mylabel'))
combolist.append(QtGui.QComboBox())
myform.addRow(labellist[i],combolist[i])
mygroupbox.setLayout(myform)
Run Code Online (Sandbox Code Playgroud)
由于值val取决于某些其他因素,myform因此无法确定布局大小.为了解决这个问题,我添加了QScrollableArea这样的内容.
scroll = QtGui.QScrollableArea()
scroll.setWidget(mygroupbox)
scroll.setWidgetResizable(True)
scroll.setFixedHeight(400)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎对groupbox没有任何影响.没有滚动条的迹象.我错过了什么吗?
qscrollarea ×10
qt ×7
python ×5
pyqt ×3
c++ ×2
layout ×2
scrollbar ×2
pyqt4 ×1
pyqt5 ×1
pyside ×1
python-3.x ×1
qgridlayout ×1
qspinbox ×1
qt4 ×1
resize ×1