创建一个可滚动的小部件区域

时间:2017-05-15 14:12:52

标签: c++ qt scrollbar

对于作业,我需要使用C ++和Qt创建类似于WordPress的CMS。在主页面中,所有帖子必须显示在带滚动条的区域中。我尝试使用QScrollArea但问题似乎是布局。它收缩内部的物体以适应提供的高度。我试图通过将对象的大小策略设置为固定来解决这个问题,但令人惊讶的是,这根本没有任何区别!

这是我正在尝试制作的窗口的代码:

#include "cms.h"
#include "user.h"
#include "post.h"
#include "uipost.h"
#include <QStyle>
#include <QDesktopWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QScrollArea>
#include <QPushButton>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QLabel>
#include <QSizePolicy>

CMS::CMS(User & SignedInUser, QWidget *parent) : QWidget(parent), signedInUser(SignedInUser) {
    User admin;
    Post temp(admin);

    QHBoxLayout *mainLayout = new QHBoxLayout();

    QScrollArea *posts = new QScrollArea();
    posts->setWidgetResizable(true);
    posts->setFrameShape(QFrame::NoFrame);
    QVBoxLayout *postsLayout = new QVBoxLayout(posts);
    for (int i = 0; i < 50; i++) {
    QLabel *label = new QLabel(tr("some sample label"));
    postsLayout->addWidget(label);
    /* Here the posts will be read from file and shown. Since the class for posts isn't still ready, I'm just trying to try it with label and later on use that class.
     * That class inheritances QFrame.
     */
    }

    QVBoxLayout *buttonsLayout = new QVBoxLayout();
    buttonsLayout->setAlignment(Qt::AlignTop);
    QPushButton *manUsers = new QPushButton(tr("Manage Users"));
    buttonsLayout->addWidget(manUsers);
    QPushButton *addUser = new QPushButton(tr("Add a User"));
    buttonsLayout->addWidget(addUser);
    QPushButton *logout = new QPushButton(tr("Log Out"));
    buttonsLayout->addWidget(logout);
    QPushButton *exit = new QPushButton(tr("Exit"));
    buttonsLayout->addWidget(exit);

    mainLayout->addWidget(posts);
    mainLayout->addLayout(buttonsLayout);
    setLayout(mainLayout);

    setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, size(), QDesktopWidget().availableGeometry())); // Centerizing the window
    setFixedSize(size()); // Making the window unresizable

    connect(exit, &QPushButton::clicked, this, &QWidget::close);
}

类定义不包含任何特定内容,只是为了确保没有遗漏任何内容:

#ifndef CMS_H
#define CMS_H

#include <QMainWindow>
#include "user.h"

namespace Ui {
    class CMS;
}

class CMS : public QWidget {
    Q_OBJECT
private:
    User & signedInUser;
public:
    CMS(User & SignedInUser, QWidget *parent = nullptr);
};

#endif // CMS_H

2 个答案:

答案 0 :(得分:1)

我在您的代码中添加了一行(在取消注释并重新排序某些行后,请在下次提供MCVE),这是

postsLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);

到你的构造函数。

QScrollArea with QLabels

注意底部的切口。

作为参考,我建议非常好documentation。有关QScrollArea的更多主题(地狱在哪里QScrollBars?),建议您完成this example

另请注意,有人可能认为您的方法不适合您的任务。

答案 1 :(得分:0)

我找到了解决方法。显然我需要定义一个小部件,将滚动区域设置为该小部件,然后将包含元素的布局设置为小部件。