4

我一直在从这里的视频教程中学习 qt 。我已经完成了 35 个视频。所以我想创建一个示例应用程序来了解 qt。我正在使用最新版本的 qt creator。

我添加了一些按钮并删除了主窗口中的菜单栏和工具栏。

在此处输入图像描述

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

在此处输入图像描述

我不希望按钮调整大小或移动。我对它们变得不可见很好,但我想要滚动条,以便用户可以滚动到不可见的部分。我添加了一个滚动区域小部件,但它不起作用。我通过在互联网上搜索进行了一些编码,但这也不起作用。当我将滚动区域的大小增加到窗口大小时;运行后窗口显示为空白。也许按钮在滚动区域“下方”。我如何更改应该在“顶部”上的对象?

另外因为我只是一个初学者,我不知道使用 qt 进行设计的最佳方法是什么。我应该只使用设计器放置所需的小部件,然后通过编码给出它们的特性吗?还是我应该使用设计师完成设计?还是我应该放弃设计师并完成完整的编码?谢谢你!

编辑 @Synxis,这没有多大帮助。我什至使用了 secentralwidget(ui->scrollareacontentswidget); 我尝试删除 centralwidget QWidget,但我不能。有什么解决办法吗?

在此处输入图像描述

4

2 回答 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)= 使用布局布局小部件,但布局的类型无关紧要,因为只需要布局一个小部件)。

您的容器小部件应根据需要进行布局,间隔器可能很有用。

于 2012-10-21T07:54:46.130 回答
0

让 QHBoxLayout 成为一个普通的 QWidget() 对象,然后将该小部件对象设置为滚动区域的小部件,调用 setWidget()。这都是真正需要的。或者至少有时您需要调用 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();
}
于 2012-10-21T08:09:01.053 回答