2013-02-28 39 views
0

我正在写Qt框架,我想创建一个QWidget。 QWidget公开了一些接口,如mousePressEvent和mouseReleaseEvent。我想扩展这个类来允许mouseClickEvent和mouseDoubleClickEvent。通常情况下,你会想扩展QWidget并实现这些功能。问题是还有其他类(例如QPushButton)作为扩展QWidget的库的一部分提供。因此,如何将这些附加功能添加到这些类中,而无需扩展每个类并复制代码?如何通过C++中的类结构共享代码?


class ClickHandeler : public QWidget { 
    virtual void mouseClickEvent(); 
    virtual void mouseDoubleClickEvent(); 

    int clickCount; //initialized to 0; 

    void mouseReleaseEvent(QEvent *event){ 
     clickCount++; 
     QTimer::singleShot(500, this, SLOT(checkClick())); 
    } 

    void checkClick(){ 
     if (clickCount == 2){ 
      this->mouseDoubleClickEvent(); 
      clickCount = clickCount-2; 
     } else { 
      this->mouseDoubleEvent() 
      clickCount--; 
     } 
    } 
} 

// QPushButton inherits QWidget too! Yikes! 
class MyPushButton : public QPushButton, public ClickHandeler { 
    void mouseClickEvent(){ 
     alert("i have been clicked"); 
    } 

    void mouseDoubleClickEvent(){ 
     alert("i have been double clicked"); 
    } 
} 

我想要的东西像MyPushButton,但我担心功能覆盖将无法按预期方式工作。

对不起,如果这个问题对人们来说是显而易见的,但我不知道术语是什么。我已经搜索了C++的接口,并且我得到了抽象接口(它不能很好地解决这个问题)。如果我只是愚蠢,需要知道一个更好的谷歌术语,让我知道在评论中,我会删除这个问题。

+0

您可以使用继承从此派生其他类。 – user1929959 2013-02-28 22:55:26

+0

@ user1929959是的,这就是我指出的,但问题是,我不想复制每个新的扩展类的代码,这是可笑的不可维护 – chacham15 2013-02-28 22:56:12

+0

在这种情况下,只是在其他平凡的方式覆盖方法。 – user1929959 2013-02-28 22:58:35

回答

0

我想你只需要扩展QWidget并调用QWidget相同的功能。 例如:

class QWidget { 
public: 
    void mouseClickEvent(); 
}; 

class QPushButton { 
public: 
    void mouseClickEvent(); 
}; 

class MyWidget : public QWidget, public QPushButton { 
public: 
    void mouseClickEvent() 
    { 
     //base::mouseClickEvent();// ambiguous 
     QWidget::mouseClickEvent(); 
     QPushButton::mouseClickEvent(); 
     /* Do your own code here */ 
    } 
}; 
+0

QPushButton已经从QWidget继承,所以这没有任何意义。你会在这里遇到死亡问题的钻石。 – 2013-03-01 09:12:34