Qt:在QScrollArea中自定义小部件

5

我试图创建一个自定义小部件。我的小部件会自动渲染,除非它位于滚动区域内。下面的代码是有效的。如果在MainWindow构造函数中将if(0)更改为if(1),则不会呈现“Hello World”字符串。我认为我必须(重新)实现一些额外的方法,但到目前为止,我还没有能够通过尝试和错误找到正确的方法。

// hellowidget.h
#ifndef HELLOWIDGET_H
#define HELLOWIDGET_H

#include <QtGui>

class HelloWidget : public QWidget
{
    Q_OBJECT
public:
    HelloWidget(QWidget *parent = 0);
    void paintEvent(QPaintEvent *event);
};

#endif // HELLOWIDGET_H

// hellowidget.cpp
#include "hellowidget.h"
HelloWidget::HelloWidget(QWidget *parent)
: QWidget(parent)
{
}
void HelloWidget::paintEvent(QPaintEvent *event)
{
     QPainter painter(this);
     painter.drawText(rect(), Qt::AlignCenter, "Hello World");
}

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
};

#endif // MAINWINDOW_H

// mainwindow.cpp
#include "mainwindow.h"
#include "hellowidget.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    HelloWidget *hello = new HelloWidget;
    QWidget *central = hello;

    if( 0 )
    {
        QScrollArea *scroll = new QScrollArea ;
        scroll->setWidget(hello);
        central = scroll;
    }

   setCentralWidget( central );
}

MainWindow::~MainWindow()
{
}

// main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

你的paintEvent函数被调用了吗?我会在那里放一个qDebug()语句,或者在调试器中断点。如果它根本没有被调用,我认为这可能是一个大小问题。尝试重新实现resizeEvent()并查看小部件设置的大小。我敢打赌它从未被设置为大于(0, 0),这意味着没有东西可以绘制。 - Caleb Huitt - cjhuitt
3个回答

9
你只需要为你的HelloWidget设置大小和位置。
在你的代码中添加这一行。
hello->setGeometry(QRect(110, 80, 120, 80)); 



如果您想要使用您的小部件填充滚动区域:

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
    QScrollArea *const scroll(new QScrollArea);
    QHBoxLayout *const layout(new QHBoxLayout(scroll)); 
    HelloWidget *const hello(new HelloWidget);
    hello->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    layout->addWidget(hello);
    setCentralWidget( scroll );
}

4
我也为此苦恼了很久,但最终发现 QScrollArea 的 setWidgetResizable 可以让 QScrollArea 允许我的部件扩展以占用可用空间。

4

根据Qt文档所述,当使用滚动区域来显示自定义小部件的内容时,确保子小部件的大小提示设置为合适的值非常重要。如果使用标准QWidget作为子小部件,则可能需要调用QWidget :: setMinimumSize()以确保在滚动区域内正确显示小部件的内容。

如果按照这些说明操作,是否有效?


我阅读并实现了那些方法,但没有成功。(为了使代码更短,我没有在示例中包含它) - user99974

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