Qt:QScrollArea中的自定义小部件
问题描述:
我正在尝试创建一个自定义小部件。我的Widget呈现自己,除非它位于滚动区域内。下面的代码工作。如果我在MainWindow构造函数中将if(0)更改为if(1),它将不会呈现“Hello World”字符串。我假设我必须(重新)实施一些额外的方法,但到目前为止,我还没有能够通过试验和错误找到正确的方法。Qt:QScrollArea中的自定义小部件
// 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();
}
答
你只需要给你的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);
}
+0
噢,天啊!这让我疯狂!上帝保佑有用的默认值.... – itmuckel 2015-11-02 17:08:30
是否调用了paintEvent函数?我会在那里放一个qDebug()语句,或者在调试器中断开。如果没有被调用,我会认为这可能是一个大小问题。尝试重新实现resizeEvent()并查看该小部件的设置大小。我敢打赌,它永远不会比(0,0)大,这意味着没有任何东西可以绘制。 – 2009-06-16 02:38:47