Qt的滚动区域并不在滚动条添加(Qt Scroll Area does not add in scr

2019-08-16 16:34发布

嗨我必须动态地创建按钮根据用户的输入,因此如果用户给出了一个大的输入数包含按钮小部件必须具有与上下滚动的能力。 为此我使用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个按钮是不可见的。

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

Answer 1:

您需要将horizo​​ntalWidget添加到垂直部件,像这样:

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);


Answer 2:

Try playing around with the QScrollBarPolicy.

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

I'm guessing that the default behavior isn't working because there is something strange going on with layouts.



文章来源: Qt Scroll Area does not add in scroll bars