1

我试图将我的函数称为 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);
            }
};
4

2 回答 2

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()));
于 2012-08-24T11:18:22.600 回答
2

目前,Qt 不允许将信号连接到未在某些 QObject 派生上声明为槽的函数。我相信Qt5 可能会提供这种可能性,但 connect 将有不同的语法来允许这样做。

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

public slots:

部分。

阅读有关信号/插槽的文档

于 2012-08-24T11:16:59.817 回答