如何在qtslot中调用我的函数?

时间:2012-08-24 11:11:28

标签: c++ qt signals-slots

我试图将我的功能称为Qt中的功能插槽,但我不知道如何去做。 似乎以下方法是错误的:

更新: 根据答案,我更新了我的源代码,但仍然显然有一些错误。编译这段代码会导致这些错误:

  

C2515:'没有合适的默认构造函数。'

并且

  

C2665:QObject :: connect':3个重载中没有一个可以转换所有   参数'。

分别在Visual Studio 2010中。

#include <QtGui/QApplication>
#include <QPushButton>
#include <QObject>
#include <QMessageBox>

class myclass;
int main(int argc,char *argv[])
{
    QApplication a(argc,argv);

    QPushButton btnshowmessage("show");
    myclass *my=new myclass();
    QObject::connect(&btnshowmessage,SIGNAL(clicked()),my,SLOT(warningmessage()));
    btnshowmessage.show();
    return a.exec();
}
//////////////////////////////////////////////////////////////////////////
class myclass: public QObject
{
Q_OBJECT
public:myclass(){}

        public slots:
            void warningmessage()
            {
                QMessageBox::warning(0,"Warning","Test Message!",QMessageBox::Ok);
            }
};

2 个答案:

答案 0 :(得分:5)

使用信号和插槽将一个对象的信号连接到另一个对象的插槽。每个信号或槽都应该在一个类中,该类必须也来自QObject类并包含Q_OBJECT宏。

所以为了使你的代码有效,把插槽放到你的某个类中:

class MySlotClass:public QObject
{
Q_OBJECT
public slots:
void MyFunction()
    {
        QMessageBox::warning(0,"WarningTest","This is a waring text message",QMessageBox::Ok);
    }
}

并像这样连接:

MySlotClass m = new MySlotClass();
Qobject::connect(&btnShowaMessageBox,SIGNAL(clicked()), &m ,SLOT(MyFunction()));

答案 1 :(得分:2)

目前Qt不允许将信号连接到某些QObject衍生物上未声明为槽的函数。我相信Qt5 may offer this possibility,但是connect会有不同的语法来允许这样做。

基本上你的槽函数必须在QObject派生类中并在

中声明
public slots:

部分。

阅读documentation on signals/slots