2014-06-17 79 views
0

我有一個抽象類TableWidget,它繼承自QWidget。它實現了paintEvent。繼承自定義小部件

class TableWidget : public QWidget 
{ 
    Q_OBJECT 

private: 
    int width; 
    int height; 

public: 
    explicit TableWidget(QWidget *parent = 0); 

    virtual int getWidthInCells() = 0; 
    virtual int getHeightInCells() = 0; 

    virtual QString getCellText(byte x, byte y) = 0; 
    virtual QString getColumnLabel(byte a) = 0; 
    virtual QString getRowLabel(byte a) = 0; 
    byte getCellHighlight(byte x, byte y); 
    void setCellHighlight(byte x, byte y, bool highlighted); 

    void setHeight(int h); 
    void setWidth(int w); 

protected: 
    void paintEvent(QPaintEvent *e); 

signals: 

public slots: 

}; 

我試着測試TableWidget與虛擬類與旁邊沒有功能。

class DummyTable : public TableWidget { 

public: 
    explicit DummyTable(QWidget *parent = 0) {} 

    int getWidthInCells() {return 2;} 
    int getHeightInCells() {return 2;} 

    QString getCellText(byte x, byte y) {return "0";} 
    QString getColumnLabel(byte a) {return QString(a);} 
    QString getRowLabel(byte a) {return QString(a);} 

}; 

問題是paintEvent(在TableWidget.cpp中實現)永遠不會被調用。我注意到的第一個錯誤是DummyTable中缺少Q_OBJECT宏。我添加並測試了它,但是這導致無法正確終止。我必須徹底退出QT才能殺死這個進程。我看着QPushButton,它似乎和我一樣,除了包含Q_OBJECT。

那麼,如何才能正確調用paintEvent?

回答

0

您可能需要給你的小部件適當的寬度和高度。如果它沒有大小,paintEvent將不會被調用。

+0

我把這看作是一種可能性,但事實並非如此; .ui文件給它一個寬度和高度。我也嘗試手動完成,但沒有奏效。 – Fabulinus

1

你是如何將DummyTable實例添加到父窗口的?

您可以嘗試在父窗口調用調試方法dumpObjectTree(http://qt-project.org/doc/qt-4.8/qobject.html#dumpObjectTree)來檢查您的實例是否已正確訪問。

此外,你可以嘗試實現showEvent(...)和儀器,檢查小部件實際上是顯示。

你看過QTableWidget嗎?它不是做你需要的嗎? http://qt-project.org/doc/qt-4.8/qtablewidget.html

關於QObject宏,您只需要在創建信號和插槽連接的類中,或者使用Qt的其他元編程功能(如屬性)。它不可能是你問題的根源。

0

原來是一個非常愚蠢的錯誤。我沒有調用父類的構造函數。