使QScrollArea动态适应其父对象,但不为其子对象扩展
Having a QScrollArea dynamically fit its parent but does not expand for its children
我似乎在从QScrollArea
获得我想要的行为方面遇到了问题。目前,每当我向设置为滚动区域目标的小部件的布局添加内容时,它都会选择扩展整个窗口,而不是适合滚动。
这是我目前的设置:
QSplitter * mainArea = new QSplitter( Qt::Vertical );
QWidget * containment = new QWidget;
containment->setLayout( new QVBoxLayout );
currentStructures = new QWidget;
currentStructures->setLayout( new QVBoxLayout );
currentStructures->layout()->setAlignment( Qt::AlignTop );
QScrollArea * scroll = new QScrollArea();
scroll->setWidget( currentStructures );
containment->layout()->addWidget( currentStructures );
mainArea->addWidget( containment );
mainArea->addWidget( new QWidget ); //TODO: create preview bar
this->layout()->addWidget( mainArea );
这使得滚动区域只会扩展,而不会显示滚动条。
插入以下行:
containment->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Ignored );
我可以让该区域忽略其子对象的大小,但它也不会占用所需的空间,也不会显示滚动条——它只会挤压其中的小部件。
我对使用Qt有点生疏,但我想知道如何实现我需要的行为:我希望滚动区域贪婪地占据它从父布局中可用的区域,但在添加时不垂直扩展包含的布局,而是实际显示滚动条。我计划允许大量调整大小,所以它需要实际缩放到父对象,而不仅仅是固定大小。我不知道如何解决GUI的这一方面。谢谢你抽出时间。
如果你想直观地解决这个问题,这里有一个你可以使用的安全带。我非常感谢你的帮助。
#include <QtWidgetsqapplication.h>
#include <QtWidgetsqsplitter.h>
#include <QtWidgetsqlayout.h>
#include <QtWidgetsqscrollarea.h>
#include <QtWidgetsqpushbutton.h>
#include <QtWidgetsqlabel.h>
#include <QtWidgetsqsizepolicy.h>
int main( int argc, char * argv[] )
{
QApplication app( argc, argv );
QWidget * testWidget = new QWidget;
testWidget->setLayout( new QVBoxLayout );
//////////////////CODE IN QUESTIION//////////////////////
QSplitter * mainArea = new QSplitter( Qt::Vertical );
QWidget * containment = new QWidget;
containment->setLayout( new QVBoxLayout );
//containment->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Ignored );
QWidget * currentStructures = new QWidget;
currentStructures->setLayout( new QVBoxLayout );
currentStructures->layout()->setAlignment( Qt::AlignTop );
QScrollArea * scroll = new QScrollArea();
scroll->setWidget( currentStructures );
containment->layout()->addWidget( currentStructures );
mainArea->addWidget( containment );
///////////////////////////////////////////////////////////
QPushButton * pushIntoLayout = new QPushButton( "Add Element to Widget" );
QWidget::connect( pushIntoLayout, &QPushButton::clicked, [currentStructures](){ currentStructures->layout()->addWidget( new QLabel( "A generated label" ) ); } );
mainArea->addWidget( pushIntoLayout );
currentStructures->setStyleSheet(
"QWidget {"
"background-color: #FAA;"
"}"
);
testWidget->layout()->addWidget( mainArea );
testWidget->show();
return app.exec();
}
即使在复制并粘贴我的代码以制作测试工具之后,我也没有注意到我的严重错误。我错误地将currentStructures
小部件推到了容器的布局中,而不是scroll
,也就是给它子对象后的滚动区域。
void QScrollArea::setWidget( QWidget * widget )
上的Qt文档摘录,供不熟悉的人使用:
小部件成为滚动区域的子部件,当删除滚动区域或设置新的小部件时,小部件将被销毁。
感谢所有看过的人。
对于那些想知道的人来说,固定代码如下所示:
QSplitter * mainArea = new QSplitter( Qt::Vertical );
QWidget * containment = new QWidget;
containment->setLayout( new QVBoxLayout );
QWidget * currentStructures = new QWidget;
currentStructures->setLayout( new QVBoxLayout );
currentStructures->layout()->setAlignment( Qt::AlignTop );
QScrollArea * scroll = new QScrollArea();
scroll->setWidget( currentStructures );
scroll->setWidgetResizable( true );
containment->layout()->addWidget( scroll );
mainArea->addWidget( containment );
mainArea->addWidget( new QWidget ); //TODO: create preview bar
this->layout()->addWidget( mainArea );
干杯!
相关文章:
- 如何将 Python 对象转换为 Cython 扩展类型的 std::vector 并返回?
- 扩展auto_ptr以释放 C 样式对象
- 从“if constexpr”分支扩展对象生存期/范围
- 扩展中的日期时间对象方法C++问题
- 在用 C++ 编写的 Python 3 扩展中,如何将 wstring 对象传递给 Python 代码
- 如何使用纯Python扩展API(Python3)包裹C 对象
- 扩展 std::thread 的 ref 对象的传递范围
- 如何在Quantlib中的现有屈服对象添加常数扩展
- 结构化绑定中的const引用扩展了分解对象的寿命
- C++ 扩展模板类时定义特定对象类型
- 在 Nodejs/V8 扩展中通过 Javascript 将C++对象传递给C++函数
- 扩展模板化类以在对象实例上具有运算符 bool<bool>
- 用c++对象的全局实例扩展嵌入式python解释器
- 禁用设置python扩展对象的属性
- 从C扩展跟踪CPython对象的生存期
- 使QScrollArea动态适应其父对象,但不为其子对象扩展
- C预处理器扩展到另一个类似对象的宏
- Android OpenGL ES 2.0使用扩展支持顶点数组对象吗?
- c++创建一个自满足的对象来扩展另一个类
- 如何在Ruby扩展C++中获得精确的对象类型