2009-06-16 2 views
4

カスタムウィジェットを作成しようとしています。私のウィジェットは、スクロールエリア内にない限り、それ自身をレンダリングします。以下のコードは動作します。 MainWindowコンストラクタ内でif(0)をif(1)に変更すると、 "Hello World"文字列はレンダリングされません。私は(再)いくつかの追加のメソッドを実装する必要があると仮定しますが、これまで試行錯誤して正しいメソッドを見つけることができませんでした。 Qt docsパー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(); 
} 
+0

paintEvent関数が呼び出されていますか? qDebug()ステートメントをそこに置くか、デバッガで中断します。それがまったく呼び出されていないのなら、それはおそらくサイジングの問題ではないかと思います。 resizeEvent()を再実装し、ウィジェットのサイズを確認してください。私はそれが決して(0、0)よりも大きく設定されていないことを賭けるでしょう。これは描画するものがないことを意味します。 –

答えて

8

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

3

、「カスタム・ウィジェットの内容を表示するには、スクロール領域を使用して、子ウィジェットのサイズヒントが適切な値に設定されていることを確認することが重要である。標準のQWidgetの場合子ウィジェットに使用されている場合は、ウィジェットの内容がスクロールエリア内に正しく表示されるようにQWidget :: setMinimumSize()を呼び出す必要があります。

この手順に従うと正しく機能しますか?

+0

私はそれを読んで、運がない方法を実装しました。 (私は、コードを短く保つために例に含めなかった) – user99974

3

また、私はこの上で私の髪を引っ張ったが、最終的にはQScrollAreaのsetWidgetResizableを発見しました。これにより、QScrollAreaは、私のウィジェットを拡大して利用可能なスペースを占めるようにしました。

関連する問題