【问题标题】:Qt Scroll Area does not add in scroll barsQt Scroll Area 不添加滚动条
【发布时间】:2013-01-15 21:21:04
【问题描述】:

大家好,我必须根据用户输入动态创建按钮,因此如果用户输入较大的输入数字,则包含按钮的小部件必须能够上下滚动。出于这个原因,我正在使用 QScrollArea。我在 Qt 设计器中生成模板,UIC 为我生成代码,然后我在我的部分中添加应该处理按钮的动态创建。但是,我似乎无法让垂直滚动条出现。这是代码的相关部分。

    verticalWidget = new QWidget(FWHMWorkflowDialog);
    verticalWidget->setObjectName(QString::fromUtf8("verticalWidget"));
    verticalWidget->setMinimumSize(QSize(150, 0));
    verticalWidget->setMaximumSize(QSize(150, 16777215));
    verticalLayout_5 = new QVBoxLayout(verticalWidget);
    verticalLayout_5->setObjectName(QString::fromUtf8("verticalLayout_5"));
    scrollArea = new QScrollArea(verticalWidget);
    scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
    scrollArea->setMaximumSize(QSize(150, 16777215));
    scrollArea->setWidgetResizable(true);
    scrollAreaWidgetContents = new QWidget();
    scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
    scrollAreaWidgetContents->setGeometry(QRect(0, 0, 130, 432));

    numberOfSlices = numberSlices;
    for (int i = 0; i < numberOfSlices; i++)
    {
        QWidget *horizontalWidget = new QWidget(scrollAreaWidgetContents);
        horizontalWidget->setMaximumSize(150,40);
        horizontalWidget->setGeometry(QRect(0, i*40, 150, 40));
        hWidgetList.push_back(horizontalWidget);

        QHBoxLayout *hLayout = new QHBoxLayout(horizontalWidget);
        hLayoutList.push_back(hLayout);
        hLayout->setSizeConstraint(QLayout::SetMinimumSize);
        hLayout->setContentsMargins(-1, 1, -1, 1);

        QPushButton *pushButton = new QPushButton(horizontalWidget);
        pushButtonList.push_back(pushButton);
        QString temp = QString("m_sliceButton").arg(i);
        pushButtonList[i]->setObjectName(temp);
        pushButtonList[i]->setGeometry(QRect(10, 20+i*40, 98, 27));
        hLayout->addWidget(pushButton);

        QCheckBox *checkBox = new QCheckBox(horizontalWidget);
        checkBoxList.push_back(checkBox);
        temp =  QString("m_checkBox").arg(i);
        checkBoxList[i]->setObjectName(temp);
        checkBoxList[i]->setEnabled(true);
        checkBoxList[i]->setGeometry(QRect(110, 20+i*40, 21, 22));

        hLayout->addWidget(checkBox);

    }

    scrollArea->setWidget(scrollAreaWidgetContents);
    //scrollArea->setWidgetResizable(true);

    verticalLayout_5->addWidget(scrollArea);

输出窗口总是如下所示。

在此示例中,用户输入的是 25,但是您可以看到第 21 个按钮被切断,其他 4 个按钮不可见。

滚动功能开始工作后出现的大小窗口问题。

【问题讨论】:

  • hWidgetListcheckBoxList 是什么?
  • 另外,它看起来很像您正在编辑 qmake 生成的 ui_windowform.h 文件,强烈建议不要这样做。
  • @Phlucious 它们是包含指向水平小部件和复选框的指针的向量。还有为什么不鼓励编辑 ui.h 文件?
  • 它会在您每次重建 .ui 文件时覆盖您的更改。如果您展开 ui.h 文件顶部的注释,它会说类似... "/********************* ****************************************************** ********* ** 通过读取 UI 文件 'mainwindow.ui' 生成的表单 ** ** 创建时间:2013 年 1 月 31 日星期四 10:20:44 ** 由:Qt 用户界面编译器版本 4.8.2 * * ** 警告!重新编译 UI 文件时,此文件中所做的所有更改都将丢失!******************************* *************************************************/ "

标签: c++ qt qt4 scrollbar scrollview


【解决方案1】:

您需要像这样将您的水平小部件添加到垂直小部件:

QVBoxLayout* vLayout = new QVBoxLayout();

for (int i = 0; i < numberOfSlices; i++)
{
    QWidget *horizontalWidget = new QWidget();
    vLayout->addWidget(horizontalWidget);
    ....
}
scrollAreaWidgetContents->setLayout(vLayout);

你的第二个问题看起来来自这一行:

scrollArea = new QScrollArea(verticalWidget);

您将scrollArea 直接添加到verticalWidget,但要使其按您希望的方式布局,您需要将其放入布局中。请尝试以下方法:

QVBoxLayout* l = new QVBoxLayout();
l->addWidget(sliceLabel); // or whatever you call it
l->addWidget(scrollArea);
l->addWidget(clearButton); // again, your name here
verticalWidget->setLayout(l);

【讨论】:

  • 这很有效,谢谢!我还必须删除行“verticalLayout_5->addWidget(scrollArea);”
  • 修复后,显示切片的小部件不再占据最大化窗口的整个长度,我尝试设置主垂直小部件的几何形状,但这并没有改变任何东西。主帖中附有截图。
  • 非常感谢我的verticalWidget在网格布局下,所以我简单地将scrollArea设置为我的主对话框窗口的子窗口而不是垂直小部件,然后将verticalWidget的定位(布局)应用到scrollArea。
【解决方案2】:

尝试使用 QScrollBarPolicy。

http://doc.qt.digia.com/qt/qabstractscrollarea.html#horizontalScrollBarPolicy-prop

我猜测默认行为不起作用,因为布局发生了一些奇怪的事情。

【讨论】:

  • +1 - 谈论布局帮助我意识到 OP 需要另一个 QScollArea 来完成它的工作。
猜你喜欢
  • 2017-09-25
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2013-10-23
相关资源
最近更新 更多