QScrollArea 无法按预期与 QWidget 和 QVBoxLayout 一起工作

2023-11-26

所以我有这个QFrame这是父小部件(由this在代码中)。在这个小部件中,我想放置一个QWidget距离顶部 10 像素(距离底部 10 像素,因此其高度为 140 像素,而父级为 160 像素)。这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;");

//this is the widget which is supposed to be scrollable
QWidget *dd = new QWidget(this);
dd->setGeometry(0,10,width,140);
dd->setStyleSheet("background: blue;");

QVBoxLayout *layout = new QVBoxLayout();
dd->setLayout(layout);

for (int i = 0; i < fValues.size(); i++)
{
    MyButton *button = new MyButton(fValues[i],dd);
    layout->addWidget(button);
}

QScrollArea *scroll = new QScrollArea(this);
scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
scroll->setWidget(dd);

与我的期望相反,这就是我得到的(附图)。我做错了什么,我该如何解决这个问题?

enter image description here


你把一堆物品弄乱了。具有可滚动区域的想法是这样的:

  • 底部是父小部件(例如QDialog)
  • 最上面是可滚动区域(QScrollArea) 固定大小
  • 最上面是一个小部件(QWidget)一定大小,通常只有部分可见(它应该比滚动区域大)
  • 最上面是一个布局
  • 最后一个:布局管理子项目(几个QPushButton here)

试试这个代码:

int
main( int _argc, char** _argv )
{
    QApplication app( _argc, _argv );

    QDialog * dlg = new QDialog();
    dlg->setGeometry( 100, 100, 260, 260);

    QScrollArea *scrollArea = new QScrollArea( dlg );
    scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
    scrollArea->setWidgetResizable( true );
    scrollArea->setGeometry( 10, 10, 200, 200 );

    QWidget *widget = new QWidget();
    scrollArea->setWidget( widget );

    QVBoxLayout *layout = new QVBoxLayout();
    widget->setLayout( layout );

    for (int i = 0; i < 10; i++)
    {
        QPushButton *button = new QPushButton( QString( "%1" ).arg( i ) );
        layout->addWidget( button );
    }

    dlg->show();

    return app.exec();
}

值得一提的是QScrollArea::setWidgetResizable,它根据其内容动态调整子窗口小部件的大小。

结果如下:

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QScrollArea 无法按预期与 QWidget 和 QVBoxLayout 一起工作 的相关文章

随机推荐

  • 如何在JPQL连接中有多个条件

    我想使用连接两个表JPQL SELECT FROM A LEFT JOIN B ON A ID B A ID AND B lng en 重要的部分是AND B lng en 这可能在JPQL JPA 2 0 不支持 ON 子句 但 JPA
  • 不同父母的 Z 指数

    我在 z 索引方面遇到了一些麻烦 这是我的简化布局 div div div div div div div div I need overlapper出现在面前child1但后面child2 我尝试摆弄 z 索引 但它不起作用 我想是因为堆
  • 不同的 DCOM / COM 安全设置意味着什么?

    我们的应用程序广泛使用 COM 和 DCOM 因此我们需要确保正确设置 COM 安全权限 我知道我可以在组件服务 MMC 管理单元下访问这些权限 并且可以在计算机的属性页下设置默认值 限制 在 DCOM Config 节点下 我可以深入了解
  • 如何重用计算列避免重复sql语句

    我有很多计算列 它们不断重复自己 一个在其他列里面 包括嵌套的 case 语句 我一直在寻找一种方法来做某事 有一个非常简化的版本 SELECT 1 2 AS A A 3 AS B B 7 AS C FROM MYTABLE 你可以尝试这样
  • 我们可以将 JsPlumb 流程图导出为 JSON 或 XML 吗?

    我创建了一个 JSPlumb 流程图 现在 我想将此流程图导出到其相应的 JSON 或 XML 脚本中以保存并执行各种操作 什么更兼容 他们中的任何一个都很好 请赐教我这一点 我开发的 JsPlumb 代码 在各个网站的帮助下 如下所示
  • Python hmac 和 C# hmac

    我们有一个 python 网络服务 它需要一个哈希作为参数 python中的hash就是这样生成的 hashed data hmac new ant bat hashlib sha1 print hashed data hexdigest
  • 多维数组 PHP-JSON

    如何在 PHP 中创建一个数组 使用 json encode 变成具有以下结构的东西 Array 1 gt Array id gt 1 data gt 45 2 gt Array id gt 3 data gt 54 尝试这样的事情 ini
  • 使用 R 中的facet_grid 单独突出显示数据

    我在 R 中使用facet grid 绘制 5 个不同组的 RT 数据 我想强调每组 5 到 95 之间的数据 在下面的代码中 我使用整个数据框的百分位数 而不是每组的百分位数 知道如何仍然使用facet grid并在图中突出显示每个组的唯
  • 在 Oracle 函数中获取上个月的最后一天

    我需要一个函数Oracle像这样 当我给参数一个简单的日期时 然后函数应该让我得到上个月的最后一天 例子 FunctionName 10 02 2011 Result should be 31 01 2011 FunctionName 21
  • 如何覆盖 RichTextBox 中的复制和粘贴

    如何重写 Richtextbox C 应用程序中的复制 粘贴功能 包括ctrl c ctrl v和右键复制 粘贴 它是 WPF RichtextBox 要覆盖命令功能 protected override bool ProcessCmdKe
  • .NET ConcurrentDictionary.ToArray() ArgumentException

    有时 当我调用 ConcurrentDictionary ToArray 时 会出现以下错误 错误如下 System ArgumentException 索引等于或大于数组的长度 或者字典中的元素数量大于从索引到目标数组末尾的可用空间 在
  • WPF 列表框通过单击空白区域删除选择

    我有一个wpflistbox使用包含矩形的自定义项目模板 中的每一项listbox可以选择 一次只能选择一个 我想添加一种行为 当用户单击不是该项目的位置时 例如 listbox 这不是一个项目 所选项目将被取消选择 有任何想法吗 谢谢 例
  • 如何在 JavaScript 中从字符串实例化类

    我处于一种奇怪的情况 我需要使用存储在变量中的字符串实例化一个新类 但即使我确定类名是正确的 我也会收到一个错误 指出给定的类名不是构造函数 这是一个不起作用的虚拟代码 class Foo constructor console log F
  • WCF 服务错误 - 传入消息具有意外的消息格式“原始”。预期的消息格式为“Xml”、“Json”

    我想将 jason 格式的数据发送到 wcf 服务进行处理 开发Wcf服务 当使用fiddler将jason输入发送到服务时 会抛出错误 服务器在处理请求时遇到错误 异常消息是 传入消息具有意外的消息格式 Raw 该操作的预期消息格式为 X
  • 如何将“插入新行”设置为 DataGridView 中的第一行

    我试图让 DataGridView 将 插入新行 行呈现为网格中的第一行而不是最后一行 我该如何做到这一点 在控制中是否可能 我认为没有任何方法可以将 新行 行移动到数据网格的顶部 但是 如果您将顶行留空 并在填充数据后将该行适当向下移动
  • border-radius 在 IE10 上不起作用

    我需要一个带圆角的容器 DIV 以下代码在除我的 IE10 之外的所有浏览器上都能完美运行 我不知道该怎么做才能使其发挥作用 about kader width 200px height 180px float left margin 0p
  • 如何让屏幕阅读器响应动态 Web 应用程序中内容的显示和隐藏?

    我想创建一个可访问的网页 其中包含许多可以在用户与页面交互时隐藏和显示的组件 当显示组件时 我希望屏幕阅读器 在本例中为 NVDA 读取该组件的内容 举个例子 div style display none div This is compo
  • 确定已安装的 TrueCrypt 卷的驱动器盘符

    将 TrueCrypt 容器安装到驱动器号后 是否可以在批处理文件中确定驱动器号是从哪个容器安装的 或者容器安装到哪个驱动器号 在批处理文件中 我想将指定的 TrueCrypt 容器挂载到指定的驱动器号 如果容器已安装或驱动器号不可用 则
  • 调用已被网页“擦除”的原生 JavaScript 函数

    假设一个网页执行了以下操作 window alert console info 我怎样才能通过浏览器控制台恢复原来的alert恢复模态的方法 我尝试访问window prototype但它不存在 我还想知道这样的过程是否普遍存在 例如 如果
  • QScrollArea 无法按预期与 QWidget 和 QVBoxLayout 一起工作

    所以我有这个QFrame这是父小部件 由this在代码中 在这个小部件中 我想放置一个QWidget距离顶部 10 像素 距离底部 10 像素 因此其高度为 140 像素 而父级为 160 像素 这QWidget在滚动区域中 内部将有许多垂