2013-07-03 21 views
0

QObject::connect採用參數如下:QObject :: connect類型的Func2參數?

connect(const QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, 
     const QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot); 

現在讓我們說我創建一個方法QPushButton *newPushButton(const QString &text, Func2 slot);,我怎麼使用Func2作爲參數的類型,我必須包括什麼?

下面是我想如何我newPushButton看起來像一個例子:

QPushButton *MyWidget::newPushButton(const QString &text, Func2 slot) 
{ 
    QPushButton *pushButton = new QPushButton(text); 
    layout->addWidget(pushButton); 
    QObject::connect(pushButton, &QPushButton::clicked, 
        this, slot); 
    return pushButton; 
} 

現在我可以把它像這樣:

MyWidget::MyWidget(QWidget *parent = 0) : QWidget(parent) 
{ 
    layout = new QVBoxLayout; 
    myButton1 = newPushButton("My Button One", &MyWidget::on_myButton1_clicked); 
    myButton2 = newPushButton("My Button Two", &MyWidget::on_myButton2_clicked); 
    setLayout(layout); 
} 

不過,我似乎無法弄清楚如何在不使用模板的情況下將&MyWidget::slot作爲參數傳遞給newPushButton()方法(connect()如何做?)。

layoutmyButton都是MyWidget的成員。

回答

1

不過,我可以」 t似乎想知道如何通過& MyWidget :: slot作爲newPushButton()方法的參數而不使用模板(connect()是如何做到的?)。

我不明白這一點 - 那些connect()的重載使用模板:http://code.woboq.org/qt5/qtbase/src/corelib/kernel/qobject.h.html#212

你就不能做同樣的?

template<typename Func2> 
QPushButton *MyWidget::newPushButton(const QString &text, Func2 slot) 
{ 
    QPushButton *pushButton = new QPushButton(text); 
    layout->addWidget(pushButton); 
    QObject::connect(pushButton, &QPushButton::clicked, 
        this, slot); 
    return pushButton; 
} 
+0

哦......我現在覺得很無聊。我怎樣才能調用'connect(...)'而不是'connect (...)'? –

+0

由於函數的模板參數可能被編譯器扣除(在這種情況下它們是這樣的),請參閱[C++ 11標準](http://isocpp.org/std/the-standard)的第14.2.2.1節, 。如果你仔細想想,你會寫'qMax(5,12)',而不是'qMax (5,12)';你編寫'std :: sort(v.begin(),v.end())',而不是'std :: sort (v.begin(),v.end())'等 – peppe

+0

太棒了,我怎麼會不知道...是隻在C++ 11中,因爲我以前從未使用C++ 11,只有98版本? :P –

0

由於您使用的信號是clicked()(不bool類型的參數?),它的類型是void(*)(),所以你可以只用void(*slot)()替換Func2 slot

QPushButton *MyWidget::newPushButton(const QString &text, void(*slot)()) 
{ 
    QPushButton *pushButton = new QPushButton(text); 
    layout->addWidget(pushButton); 
    QObject::connect(pushButton, &QPushButton::clicked, 
        this, slot); 
    return pushButton; 
} 
+0

不可以,'Func2'類型爲'void(MyWidget :: *)()'。但是我不能使用它,因爲我想像'connect'一樣概括它。我當然可以將我的'newPushButton'作爲模板方法,但是必須有一個更簡單的方法,因爲'connect'使用'Func2'。 –

相關問題