2016-04-23 64 views
1

我想讓按鈕在點擊後繼續按下。所以我做了一個插槽make_pushed,我試圖用於這個目的。點擊的按鈕由QObject :: sender()方法標識。但由於不起作用,所以出現了問題。QObject :: sender()在插槽中無法正常工作

QPushButton * size=new QPushButton("size",this);  
connect(size, SIGNAL(clicked()), this, SLOT(make_pushed())); 
void Window4::make_pushed() 
{ 
    QObject* sender = this->sender(); 
    QPushButton* button = qobject_cast<QPushButton*>(sender); 
    button->setDown(true); 
    button->setText("Yep"); 
} 


class Window4 : public QWidget 
{ 
public: 
    Window4(QWidget * parent=0); 
private slots: 
    void make_pushed(); 
}; 

有一個在應用程序輸出的錯誤「的QObject ::連接:在沒有這樣的插槽QWidget的:: make_pushed()」,雖然一切編譯和出現的窗口。問題是插槽顯然沒有找到,雖然它在同一個cpp文件和標題中。因此,當點擊時,這個botton neigher改變它的文本,也不會被推送。

+1

什麼不起作用?你在期待什麼?你看見什麼了? – user3528438

+1

什麼是Windows4?如何在頭中聲明'make_pushed'?你做過'Q_OBJECTS'嗎?你做了'Q_SLOTS'嗎?哪個QT版本? – user3528438

+0

編輯帖子 – parsecer

回答

1

你只是忘在類聲明http://doc.qt.io/qt-5/qobject.html Q_OBJECT宏:

注意,Q_OBJECT宏是強制性的,它實現信號,槽或性質的任何對象。您還需要在源文件上運行Meta Object Compiler。我們強烈建議在QObject的所有子類中使用此宏,而不管它們是否實際使用信號,槽和屬性,因爲如果不這樣做可能導致某些函數表現出奇怪的行爲。

http://doc.qt.io/qt-5/qobject.html#Q_OBJECT

的Q_OBJECT宏必須出現在類的定義,聲明自己的信號和槽的私人部分或使用通過Qt的元對象系統提供的其他服務。

注意:該宏要求該類是QObject的子類。使用Q_GADGET而不是Q_OBJECT來啓用元對象系統對不是QObject子類的類中枚舉的支持。

只要使用它像這樣每次你繼承的QObject/QWidget的/ ...時間:

#include <QObject> 

class Counter : public QObject 
{ 
    Q_OBJECT 

    // ... 
}