2017-03-15 76 views
0

我正在學習如何在Visual Studio中使用QT。目前,我正在使用QT 5.8和2017年版。我創建了一個新項目,並在QT設計器中添加了一些單選按鈕。現在,我想實施一些操作,例如「單擊單選按鈕時執行此操作」。這是我的代碼:Qt信號插槽visual studio:似乎不能連接

Draw.cpp

#include "Draw.h" 

#include "qpushbutton.h" 
#include "qradiobutton.h" 
#include "qgroupbox.h" 

Draw::Draw(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    ui.setupUi(this); 

    //Invisible elements 
    ui.frmAbsolut->setVisible(false); 

    //We create the connections to methods 
    connect(this->ui.myradiobutton1, SIGNAL(toggled(bool)), this, SLOT(on_rdbMethod_change(this->ui.myradiobutton1->isChecked, 0))); 

} 

void Draw::on_rdbMethod_change(bool value, int option) 
{ 
    //0: frmAbsolut 
    printf("%d \n", option); 
    if (value == true){ 
     if (option == 0) { 
      this->ui.frmAbsolut->setVisible(true); 
     } 
    } 
} 

Draw.h

#pragma once 

#include <QtWidgets/QMainWindow> 
#include "ui_Draw.h" 

class Draw: public QMainWindow 
{ 
    Q_OBJECT 

public: 
    Draw(QWidget *parent = Q_NULLPTR); 

private: 
    Ui::DrawClass ui; 

protected slots: 
    void on_rdbMethod_change(bool, int); 

}; 

如果我運行該程序,我沒有得到任何錯誤,如果我檢查連接(。 ..)行,我看到這個被調用,但是當我單擊該單選按鈕時,它不會調用我的方法。這有什麼問題?

回答

2
connect(this->ui.myradiobutton1, SIGNAL(clicked), this, SLOT(on_rdbMethod_change(this->ui.myradiobutton1->isChecked, 0))); 

以上是不正確 - 如果你看一下你的程序的標準輸出的輸出,你可能會看到連接()是印刷關於它的錯誤消息。

尤其是,您沒有在單擊後包括圓括號,並且您的slot-methods參數必須與signal-method的參數相同,或者至少與signal-method的前N個相同參數。在這種情況下,由於信號(clicked())沒有參數,這意味着您的slot-method也不需要參數;因此您需要更改on_rdbMethod_change()以不帶任何參數,或者指定一個不同的slot-method(也許可以實現該slot-method來調用on_rdbMethod_change(this-> ui.myradiobutton1-> isChecked,0)),如果這就是你想要的)。此外,connect()調用不能在SIGNAL /槽參數列表中使用值,只能使用類型。

所以修正connect()調用會是這個樣子:

connect(this->ui.myradiobutton1, SIGNAL(clicked()), this, SLOT(on_rdbMethod_change())); 
+0

所以,如果我不同的單選按鈕連接到這個插槽中,我怎麼能知道,從on_rdbMethod_change其中單選按鈕並調用它呢? –

+1

如果您在slot方法內調用QObject :: sender()(http://doc.qt.io/qt-5/qobject.html#sender),它將返回QObject的指針指向QObject發出信號。然後,您可以使用dynamic_cast <>將該指針向下翻到QAbstractButton(或其他),並將其與myradiobutton1(或其他)進行比較,以查看它是哪個按鈕。 (請注意,這不是一個好的面向對象的設計,因爲它意味着如果從別的上下文中調用它,你的插槽可能不會做正確的事;但作爲實際的作品) –

+1

或者使用新的語法和lambda表達式你可以忘記'sender()',運行時錯誤和所有相關的煩惱。那麼它就會工作。 –