我的设置如下所示:
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)
在最后一个命令中,它滚动到最大值减去新添加的小部件的高度。有没有办法在滚动之前刷新更改?
提前致谢 卢卡斯
我最近开始学习Python,现在我正在使用PyQt库制作一个带有GUI的软件.
这是我的问题:我创建了一个Scrollarea,我在这个scrollarea中添加了一个包含QGridLayout的小部件.
sa = QtGui.QScrollArea()
sa_widget = QtGui.QWidget()
self.sa_grid.setSizeConstraint(QtGui.QLayout.SetMinAndMaxSize)
sa_widget.setLayout(self.sa_grid)
sa.setWidgetResizable(True)
sa.setWidget(sa_widget)
Run Code Online (Sandbox Code Playgroud)
然后我添加了10个QLabel(当然这只是一个例子,在这个例子中我使用QGridLayout就像一个垂直布局):
i = 0
while i<100:
i = i +1
add = QtGui.QLabel("Row %i" % i)
self.sa_grid.addWidget(add)
Run Code Online (Sandbox Code Playgroud)
然后我创建一个调用函数"function_name"的按钮,我希望这个函数删除一行,到目前为止这是我写的:
tmp = QtGui.QWidget()
tmp = self.sa_grid.itemAt(0)
self.sa_grid.removeItem(tmp)
Run Code Online (Sandbox Code Playgroud)
它删除了第一行,gridlayout的每一行都变成了行x-1,但是,它没有删除文本"Row 1",所以我在同一行看到"Row 0"和"Row 1".
有人可以帮帮我吗?
提前感谢,Davide
我有一个带有QScrollArea小部件的ui 。在QScrollArea使用的FlowLayout。我的问题是,当我将小部件添加到布局中时,滚动区域开始滚动并且在有扩展空间时不会扩展。我希望在滚动条首先出现之前将滚动区域扩展到其极限。
如何在滚动条出现之前扩大滚动区域?
我正在尝试QTreeView自动调整其内容的大小.这是我的设置:我想创建一个"智能"工具提示这是一个QWidget有Qt.Tool | Qt.FramelessWindowHint作为WindowFlags,这很好地工作.它包含一些布局,其中包含一些按钮(大小不变)和QTreeView.现在,无论何时将线条添加到QTreeView模型中,QTreeView都应自动增加其大小以避免垂直滚动条.
设置QSizePolicy.Expanding工具提示小部件和QTreeView没有改变任何东西 - 也许我在这里缺少一些额外的标志或东西.
我也试过以下,蛮力方法:
class ToolTip:
def __init__(self):
...
self.itemView.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
self.itemView.verticalScrollBar().rangeChanged.connect(self.resizeViewVertically)
def resizeViewVertically(self, min, max):
self.resize(self.width(), self.height() + max)
Run Code Online (Sandbox Code Playgroud)
大部分时间都有效,但并非总是如此.每隔一段时间(每隔一段时间,确切地说,但我不知道这是否是巧合),使用此代码,视图正确调整大小(即所有内容都适合,并且不需要滚动条),但滚动条不会消失,允许滚动到最后一行下方的空白区域.
我试图在运行时通过按下按钮来添加新的小部件(在下面的示例中我使用标签)。这里是例子:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Widget(QWidget):
def __init__(self, parent= None):
super(Widget, self).__init__()
btn_new = QPushButton("Append new label")
self.connect(btn_new, SIGNAL('clicked()'), self.add_new_label)
#Container Widget
self.widget = QWidget()
#Layout of Container Widget
layout = QVBoxLayout(self)
for _ in range(20):
label = QLabel("test")
layout.addWidget(label)
self.widget.setLayout(layout)
#Scroll Area Properties
scroll = QScrollArea()
scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
scroll.setWidgetResizable(False)
scroll.setWidget(self.widget)
#Scroll Area Layer add
vLayout = QVBoxLayout(self)
vLayout.addWidget(btn_new)
vLayout.addWidget(scroll)
self.setLayout(vLayout)
def add_new_label(self):
label = QLabel("new")
self.widget.layout().addWidget(label)
if __name__ == '__main__':
app = …Run Code Online (Sandbox Code Playgroud) 有人建议我重新实现QWheelEvent处理程序并检查每个子窗口小部件visibleRegion是否为0.
还有更好的建议吗?
所以我有这个QFrame是父窗口小部件(this在代码中表示).在这个小部件中,我想QWidget从顶部放置一个10 px(从底部放置10 px,因此它的高度为140px,而父级为160px).在QWidget将具有多个在其内部自定义按钮在垂直布局,在滚动区域,使得当按钮组合的高度超过QWidget's在自动高度(140px),滚动集.由于滚动不是针对整个父窗口小部件,而是针对子窗口小部件,因此滚动应仅适用于此处的子窗口小部件.这是我的代码:
//this is a custom button class with predefined height and some formatting styles
class MyButton: public QPushButton
{
public:
MyButton(std::string aText, QWidget *aParent);
};
MyButton::MyButton(std::string aText, QWidget *aParent): QPushButton(QString::fromStdString(aText), aParent)
{
this->setFixedHeight(30);
this->setCursor(Qt::PointingHandCursor);
this->setCheckable(false);
this->setStyleSheet("background: rgb(74,89,98); color: black; border-radius: 0px; text-align: left; padding-left: 5px; border-bottom: 1px solid black;");
}
//this is where I position the parent widget first, and then add sub widget
this->setGeometry(x,y,width,160);
this->setStyleSheet("border-radius: 5px; background:red;"); …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 Qt 应用程序,我试图找到一种方法来使用 QTextEdit 作为label没有滚动条的长文本。在我的 ui 中,我有一个QScrollArea,在它里面我想放置几个QTextEdit小部件,我只想在里面使用滚动QScrollArea。问题是,无论我如何尝试调整大小,QTextEdit它似乎都有最大高度和文本剪切,即使我手动设置大小并QTextEdit::size返回正确的值。
我做了同样的事情,QLabel它工作正常,但在这种情况下,我需要一些仅在QTextEdit.
我找到了这篇文章: 调整 QT 的 QTextEdit 以匹配文本高度:maximumViewportSize()
给出的答案如下:
我已经解决了这个问题。为了让它工作,我必须做两件事:
- 向上走小部件层次结构并确保所有大小策略都有意义,以确保如果任何子小部件想要变大/变小,那么父小部件将希望成为相同的东西。
- 这是修复的主要来源。事实证明,由于 QTextEdit 位于 QScrollArea 中的主要小部件 QFrame 内,因此 QScrollArea 有一个约束,除非“widgetResizable”属性为真,否则它不会调整内部小部件的大小。文档在这里:http : //doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop. 在我尝试使用此设置并使其工作之前,文档对我来说并不清楚。从文档来看,这个属性似乎只处理主滚动区域想要调整小部件大小的时间(即从父滚动到子滚动)。这实际上意味着如果滚动区域中的主要小部件想要调整大小(即从子到父),则必须将此设置设置为 true。因此,故事的寓意是 QTextEdit 代码在覆盖 sizeHint 方面是正确的,但 QScrollArea 忽略了从主框架的 sizeHint 返回的值。
问题是我不知道如何访问QTextEdit's QScrollArea以启用widgetResizable. 任何人都可以解释我如何实现这一目标或建议一种不同的调整大小QTextEdit以完全适合其内容的方法吗?
如何自动滚动滚动区域?例如,当有新的更新而不是滚动区域的视图保持不变时,我想使用新文本继续下去。可以将其视为在 CMD 控制台中,当您键入命令时,它会随输出一起自动滚动。
qscrollarea ×10
qt ×6
c++ ×4
pyqt ×4
resize ×3
layout ×2
python ×2
qtextedit ×2
flowlayout ×1
qframe ×1
qgridlayout ×1
qlabel ×1
qt4 ×1
qt5 ×1
qtableview ×1
qtreeview ×1
qwidget ×1
scroll ×1