Qt:无法直接将滚动条添加到带有子项的窗口小部件

时间:2018-09-19 10:16:53

标签: c++ qt qwidget qscrollarea

我是Qt编程的新手,我想向其中包含子小部件的小部件添加滚动条。我已经看到了一些类似的问题/帖子:

1。How to add a scrollbar to parent QWidget

2。Insert a scrollbar in a qt widget using qtcreator

3。Adding scroll bar to a Qwidget

4。QScrollArea missing Scrollbar

但是大多数答案都为我们为其添加滚动条的小部件设置了布局。

我的问题:

我需要为其滚动条的小部件中有许多子小部件,但是我没有添加任何布局。子小部件的几何形状是可修改的,因此我没有为父小部件添加任何布局。

下面是我的代码:

class Absolute : public QWidget {

public:
 Absolute(QWidget *parent = 0);
};

Absolute::Absolute(QWidget *parent)
 : QWidget(parent) {

QTextEdit *ledit = new QTextEdit(this);
ledit->setGeometry(5, 5, 500, 550);

QTextEdit *lledit = new QTextEdit(this);
lledit->setGeometry(510, 5, 250, 550);

/*QScrollArea* sa = new QScrollArea();
sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
auto *widget = new QWidget(this);
sa->setWidget(widget);

auto *l = new QVBoxLayout(this);
l->setMargin(0);
l->addWidget(sa);*/
}

int main(int argc, char *argv[]) {

QApplication app(argc, argv);

Absolute window;
window.setWindowTitle("Absolute");
window.setGeometry(500,500,1500,1000);
window.show();

return app.exec();
}

但是,如果没有滚动条代码(带注释的部分),则UI在setGeometry中设置的给定位置具有这些文本编辑。

如果第二个textedits宽度更大,我需要带一个滚动条。

所以我尝试添加滚动条(注释部分)。但是,我只能看到滚动条,而看不到textedits。

任何建议/建议都会非常有帮助。谢谢!!

1 个答案:

答案 0 :(得分:1)

原因

创建小部件和布局时设置父项的方式不正确。

解决方案

创建正确的父/子层次结构,并设置QScrollArea的小部件的所需大小。无需为此小部件设置布局。

示例

这是我为您准备的一个示例,目的是演示如何解决Absolute

class Absolute : public QWidget {
public:
    Absolute::Absolute(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        auto *sa = new QScrollArea(this);
        auto *l = new QVBoxLayout(this);
        auto *widget = new QWidget();
        auto *ledit = new QTextEdit(widget);
        auto *lledit = new QTextEdit(widget);

        sa->setWidgetResizable(true);
        sa->setWidget(widget);
        sa->setAlignment(Qt::AlignLeft | Qt::AlignTop);

        ledit->setGeometry(5, 5, 500, 550);
        lledit->setGeometry(510, 5, 250, 550);

        widget->setFixedSize(lledit->geometry().right(), lledit->geometry().bottom());

        l->setMargin(0);
        l->addWidget(sa);
    }
};

注意:出于演示目的,widget的大小设置为(lledit->geometry().right(), lledit->geometry().bottom())。您可以考虑根据自己的特定需求进行调整。