Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在qtslot中调用my函数?_C++_Qt_Signals Slots - Fatal编程技术网

C++ 如何在qtslot中调用my函数?

C++ 如何在qtslot中调用my函数?,c++,qt,signals-slots,C++,Qt,Signals Slots,我试图将我的函数作为Qt中的函数槽调用,但我不知道如何进行。 似乎以下方法是错误的: 更新: 根据回答,我更新了源代码,但仍然有一些明显的问题。试图编译这段代码会导致以下错误: C2515:'没有合适的默认构造函数可用。' 及 C2665:QObject::connect”:3个重载都不能转换所有 争论。” 分别在VisualStudio2010中 #include <QtGui/QApplication> #include <QPushButton> #include

我试图将我的函数作为Qt中的函数槽调用,但我不知道如何进行。 似乎以下方法是错误的:

更新: 根据回答,我更新了源代码,但仍然有一些明显的问题。试图编译这段代码会导致以下错误:

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

C2665:QObject::connect”:3个重载都不能转换所有 争论。”

分别在VisualStudio2010中

#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);
            }
};
#包括
#包括
#包括
#包括
类myclass;
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QPushButton btnshowmessage(“显示”);
myclass*my=新的myclass();
QObject::connect(&BTN显示消息、信号(单击())、我的、插槽(警告消息());
btnshowmessage.show();
返回a.exec();
}
//////////////////////////////////////////////////////////////////////////
类myclass:公共QObject
{
Q_对象
public:myclass(){}
公众时段:
无效警告消息()
{
QMessageBox::warning(0,“警告”,“测试消息!”,QMessageBox::Ok);
}
};

目前,Qt不允许将信号连接到某些QObject派生上未声明为插槽的函数。我相信,但是connect将使用不同的语法来实现这一点

基本上,插槽函数必须位于QObject派生类中,并在

public slots:


阅读。

当前Qt不允许将信号连接到未声明为某些QObject派生上插槽的函数。我相信,但是connect将使用不同的语法来实现这一点

基本上,插槽函数必须位于QObject派生类中,并在

public slots:


阅读。

使用信号和插槽将一个对象的信号连接到另一个对象的插槽。每个信号或插槽都应位于一个类内,该类还必须派生自
QObject
类,并包含
Q\u对象

因此,要使代码正常工作,请将插槽放入您的某个类中:

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()));

使用信号和插槽将一个对象的信号连接到另一个对象的插槽。每个信号或插槽都应位于一个类内,该类还必须派生自
QObject
类,并包含
Q\u对象

因此,要使代码正常工作,请将插槽放入您的某个类中:

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()));


connect将编译,但失败-SLOT(myFunction())应该是SLOT(myFunction())(或者类中的函数应该以小写字母开头)。SLOT宏将其参数转换为字符串,并在运行时完成查找。@SingerOfTheFall:非常感谢。顺便说一句,它不应该是:MySlotClass*m=new MySlotClass();而不是MySlotClass m=new MySlotClass();这样做我还是会出错。我更新了第一篇文章来解决最新的问题。@Hossein,把你的课放在一个单独的单元中。类定义应该在头文件中。@Houssein:在main中,编译器到目前为止只看到myclass的转发声明,您正在尝试a)创建该类的新对象,b)将其转换为QObject*。此时,编译器只知道myclass是一个不完整的类型。connect将进行编译,但失败-插槽(myFunction())应为插槽(myFunction())(或者类中的函数应以小写字母开头)。SLOT宏将其参数转换为字符串,并在运行时完成查找。@SingerOfTheFall:非常感谢。顺便说一句,它不应该是:MySlotClass*m=new MySlotClass();而不是MySlotClass m=new MySlotClass();这样做我还是会出错。我更新了第一篇文章来解决最新的问题。@Hossein,把你的课放在一个单独的单元中。类定义应该在头文件中。@Houssein:在main中,编译器到目前为止只看到myclass的转发声明,您正在尝试a)创建该类的新对象,b)将其转换为QObject*。此时,编译器只知道myclass是一个不完整的类型。将myclass的定义放在int main()之前,看看这是否能解决问题。使用前向声明,connect不知道myclass是QObject派生。@drescherjm:我使用前向声明解决了这个问题。即使我按照你说的做了,我也会收到一堆其他链接器特定的错误!我不知道是什么原因!我告诉你,远期申报不起作用。此外,链接器错误可能是由没有在代码上运行moc引起的。请记住,如果类中有信号/插槽或使用Q_对象宏,则始终需要运行moc。我不确定您是如何定义项目来调用moc的,我可能无法帮助您,因为我使用CMake为Visual Studio生成了我的Qt项目(它为我指定的文件设置了moc)不是QQueD还是QtADDON。你是使用VisualStudio QT Advin并将其设置为Qt项目吗?@ dReSerjm + 1 R.E.FWD声明-这只是一个C++错误,与Qt之前定义MyC类的定义无关,并看它是否修复了一些东西。使用前向声明,connect不知道myclass是QObject派生。@drescherjm:我使用前向声明解决了这个问题。即使我按照你说的做了,我也会收到一堆其他链接器特定的错误!我不知道是什么原因!我告诉你,远期申报不起作用。此外,链接器错误可能是由没有在代码上运行moc引起的。请记住,如果类中有信号/插槽或使用Q_对象宏,则始终需要运行moc。我不确定您是如何定义项目来调用moc的,我可能无法帮助您,因为我使用CMake(为我指定的文件设置moc)而不是qmake或qtaddon为Visual Studio生成Qt项目。您使用的是Visual Studio Qt Add吗-