質問
カスタムウィジェットを作成しようとしています。私のウィジェットは、スクロール領域内にない限り、それ自体をレンダリングします。以下のコードは機能します。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();
}
解決
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 );
}
他のヒント
当たり Qt ドキュメント, "スクロール領域を使用してカスタム ウィジェットのコンテンツを表示する場合、子ウィジェットのサイズ ヒントが適切な値に設定されていることを確認することが重要です。標準の QWidget が子ウィジェットに使用されている場合、ウィジェットのコンテンツがスクロール領域内に正しく表示されることを確認するために、QWidget::setMinimumSize() を呼び出す必要がある場合があります。
この指示に従えば正しく動作しますか?
私もこれについて髪を引っ張っていましたが、最終的に QScrollArea を見つけました。 setWidgetResizable, これにより、QScrollArea により、ウィジェットが利用可能なスペースを占めるまで展開できるようになりました。
所属していません StackOverflow