在Qt窗口中添加滚动条?

4
我一直在通过视频教程这里学习Qt编程。我已经完成了35个视频的学习。因此,我想创建一个示例应用程序来更好地理解Qt。我正在使用最新版本的Qt Creator。
我在主窗口中添加了一些按钮,并删除了菜单栏和工具栏。

enter image description here

在运行后,我发现如果调整窗口大小,滚动条不会出现。

enter image description here

我不希望按钮被调整大小或移动。它们变得不可见是可以接受的,但我想要滚动条,以便用户可以滚动到不可见的部分。 我添加了一个滚动区域小部件,但它不起作用。我通过在互联网上搜索进行了一些编码,但也没有起作用。当我将滚动区域的大小增加到窗口大小时,运行窗口会出现空白。也许是按钮“在下面”,在如何更改哪个对象应该在“顶部”方面? 此外,由于我只是一个初学者,我不知道使用qt进行设计的最佳方法。我应该仅使用设计师放置所需的小部件,然后通过编码来指定其特性吗?还是应该完全使用设计师进行设计?或者应该放弃设计师并进行完全编码? 谢谢! 编辑 @Synxis, 那没什么帮助。我甚至使用了secentralwidget(ui->scrollareacontentswidget); 我尝试删除centralwidget QWidget,但我不能。 有解决办法吗?

enter image description here

2个回答

4

一个QWidget没有滚动条,您需要添加一个带有滚动条的区域。

只需将QScrollArea添加到窗口中,并将所有小部件(按钮等)放入其中。不要忘记将滚动区域布局到整个主窗口。

更确切地说,层次结构是这样的:

main window central widget (with a layout)
    scroll area
        scroll area widget (with a layout, layout scroll area if you're in the designer)
            your container widget (should be layouted also)
                your buttons, layouts, etc...

((with a layout) = 使用布局对小部件进行布局,但布局的类型并不重要,因为只需要对一个小部件进行布局).

您的容器小部件应按您想要的方式进行布局,间隔器可能很有用。


谢谢您的回复,但您能告诉我如何做吗? 因为我已经添加了PushButton,如果我在此之后添加ScrollArea小部件,它将成为CentralWidget的子级。我该如何将PushButton的父级从CentralWidget更改为ScrollArea? - Cool_Coder
1
在设计师中,将QScrollArea作为主窗口的子项添加。然后,将centralWidget放入其中。现在只有滚动区域位于主窗口中,因此您可以使用布局(无论布局类型如何,因为您只会布局1个元素)。 - Synxis
1
你的布局不正确:滚动区域的小部件(名为scrollAreaContent,省略号中不知道是什么)没有布局。你必须创建一个容器小部件,在其中放置你的按钮等等... 此外,你的回答不是一个 SO 回答,它将被删除。请考虑编辑你的问题。 - Synxis
没问题,我编辑了你的问题。你成功实现滚动区域了吗?(我已经编辑了我的回答)? - Synxis
1
好的,测试过了。选择 scrollArea,布局它。然后不要忘记布局你的 QFrame(这个可以使用间隔器)。 - Synxis
显示剩余7条评论

0

让QHBoxLayout成为一个普通的QWidget()对象,然后调用setWidget()将该widget对象设置为滚动区域的widget。这实际上就是所需的全部内容。或者至少有时需要调用setWidgetResizable(bool),如果可以利用额外的空间。以下是示例代码。

#include <QtGui>

class YourWidget : public QWidget
{
public:
    YourWidget(QWidget* parent=0)
        : QWidget(parent)
    {
        QHBoxLayout* buttonLay = new QHBoxLayout;
        for (int i=0; i<10; ++i) {
            QPushButton* button = new QPushButton(tr("Button%1").arg(i));
            buttonLay->addWidget(button);
        }

        QLabel* dummyBigLabel = new QLabel(tr("DummyBigLabel"));
        dummyBigLabel->setAlignment(Qt::AlignCenter);
        dummyBigLabel->setMinimumSize(400,300);
        dummyBigLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);

        QVBoxLayout* mainLay = new QVBoxLayout(this);
        mainLay->addLayout(buttonLay);
        mainLay->addWidget(dummyBigLabel);
    }
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

QWidget* topLevelWidget = 0;
    YourWidget* editor = new YourWidget;
#ifdef USE_NO_SCROLL_AREA
    topLevelWidget = editor;
#else
    QScrollArea* scroller = new QScrollArea;
    scroller->setWidget(editor);
    topLevelWidget = scroller;
#endif
    topLevelWidget->show();
    topLevelWidget->raise();
    return app.exec();
}

谢谢您的回复,但是我不太明白你想说什么。 也许这是因为我只是一个初学者。 您能否稍微解释一下您的代码? 再次感谢 :) - Cool_Coder
1
嗯,我认为可以编译并执行的示例代码是最简单的指南。Qt的代码本身非常易读。如果您能指出以上代码的哪个部分不可理解,那我可以更好地帮助您。 - Joonhwan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接