2009-06-16 203 views
4

我正在嘗試創建一個自定義小部件。我的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(); 
} 
+0

是否調用了paintEvent函數?我會在那裏放一個qDebug()語句,或者在調試器中斷開。如果沒有被調用,我會認爲這可能是一個大小問題。嘗試重新實現resizeEvent()並查看該小部件的設置大小。我敢打賭,它永遠不會比(0,0)大,這意味着沒有任何東西可以繪製。 – 2009-06-16 02:38:47

回答

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 2015-11-02 17:08:30

3

Qt docs,「在使用滾動區域顯示自定義窗口小部件的內容,重要的是要確保子部件的尺寸暗示設置爲一個適當的值。如果標準QWidget的是用於子窗口小部件,可能需要調用QWidget :: setMinimumSize()以確保窗口小部件的內容在滾動區域內正確顯示。「

如果按照這些說明執行操作是否正常?

+0

我閱讀並且沒有運氣就實現了這些方法。 (我沒有在示例中加入它,以使代碼更短) – user99974 2009-06-16 02:20:02

3

我在外面拉我的頭髮在這個還可以,但最終發現QScrollArea的setWidgetResizable ,這使得QScrollArea允許我的小部件擴展以佔用可用空間。