Qt:QScrollArea 中的自定义小部件

Posted

技术标签:

【中文标题】Qt:QScrollArea 中的自定义小部件【英文标题】:Qt: Custom widget in QScrollArea 【发布时间】:2009-06-16 02:06:02 【问题描述】:

我正在尝试创建自定义小部件。我的 Widget 会自行呈现,除非它位于滚动区域内。下面的代码有效。如果我在 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),这意味着没有什么可画的。 【参考方案1】:

你只需要给你的 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 );

【讨论】:

【参考方案2】:

Per Qt docs,“当使用滚动区域显示自定义小部件的内容时,确保子小部件的大小提示设置为合适的值非常重要。如果使用标准 QWidget子窗口小部件,可能需要调用 QWidget::setMinimumSize() 以确保窗口小部件的内容在滚动区域内正确显示。"

如果您按照这些说明进行操作是否正确?

【讨论】:

我读到了这些方法,但没有成功。 (我没有在示例中包含它以使代码更短)【参考方案3】:

我也为此烦恼,但最终找到了 QScrollArea 的 setWidgetResizable,这使得 QScrollArea 允许我的小部件展开以占用可用空间。

【讨论】:

以上是关于Qt:QScrollArea 中的自定义小部件的主要内容,如果未能解决你的问题,请参考以下文章

将小部件放在 QScrollArea 的中心

Qt - QScrollArea 小部件剪辑内容

QtDesigner 中的自定义 qt 小部件

Qt 自定义小部件如何通知 ScrollArea 父级视图更改

使用 PyQt5 在 Qt Designer 中的自定义(升级)小部件中获取另一个小部件的当前值

Qt:如何制作像 QTextField 一样对齐的自定义小部件