我正在學習如何在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);
};
如果我運行該程序,我沒有得到任何錯誤,如果我檢查連接(。 ..)行,我看到這個被調用,但是當我單擊該單選按鈕時,它不會調用我的方法。這有什麼問題?
所以,如果我不同的單選按鈕連接到這個插槽中,我怎麼能知道,從on_rdbMethod_change其中單選按鈕並調用它呢? –
如果您在slot方法內調用QObject :: sender()(http://doc.qt.io/qt-5/qobject.html#sender),它將返回QObject的指針指向QObject發出信號。然後,您可以使用dynamic_cast <>將該指針向下翻到QAbstractButton(或其他),並將其與myradiobutton1(或其他)進行比較,以查看它是哪個按鈕。 (請注意,這不是一個好的面向對象的設計,因爲它意味着如果從別的上下文中調用它,你的插槽可能不會做正確的事;但作爲實際的作品) –
或者使用新的語法和lambda表達式你可以忘記'sender()',運行時錯誤和所有相關的煩惱。那麼它就會工作。 –