继承自Custom Widget

时间:2014-06-17 01:05:36

标签: c++ qt inheritance widget

我有一个抽象类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?

3 个答案:

答案 0 :(得分: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的其他元编程功能(例如属性)。它不太可能是你问题的根本原因。

答案 1 :(得分:0)

您可能需要为小部件提供适当的宽度和高度。如果它没有大小,则不会调用paintEvent。

答案 2 :(得分:0)

事实证明这是一个非常愚蠢的错误。我没有调用父类的构造函数。