Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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++ 从Qt中的类调用插槽_C++_Qt_Signals Slots - Fatal编程技术网

C++ 从Qt中的类调用插槽

C++ 从Qt中的类调用插槽,c++,qt,signals-slots,C++,Qt,Signals Slots,我正在尝试编写一个从服务器获取文件的应用程序 我有一个“窗口”类(mainwindow.cpp,它是一个小部件类,将作为UI),然后我有一个“后端”类(Backend.cpp) GUI有一个按钮和两个单选按钮。如果选择了单选按钮“remote”,则单击该按钮将导致从服务器获取文件 但是,Backend.cpp中的“connect”调用中存在一些我无法解决的问题。我得到的错误是:没有匹配的函数调用'QObject::connect(QNetworkReply*&),const char[13],B

我正在尝试编写一个从服务器获取文件的应用程序

我有一个“窗口”类(mainwindow.cpp,它是一个小部件类,将作为UI),然后我有一个“后端”类(Backend.cpp)

GUI有一个按钮和两个单选按钮。如果选择了单选按钮“remote”,则单击该按钮将导致从服务器获取文件

但是,Backend.cpp中的“connect”调用中存在一些我无法解决的问题。我得到的错误是:没有匹配的函数调用'QObject::connect(QNetworkReply*&),const char[13],Backend*const,const char[20])

代码如下:

答案:避免圆形夹杂物!!!! 以下是更新的代码:

主窗口

#ifndef WINDOW_H
#define WINDOW_H

#include <QWidget>
#include <QRadioButton>
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QHostAddress>
#include <QFile>
#include <QUrl>

#include "Backend.h"
class QGroupBox;

class Window : public QWidget
{
    Q_OBJECT

public:
    Window(QWidget *parent = 0);
    QTcpSocket *conn;
    QFile *file;

    QUrl url;
    Backend backend_inst;

private:

    QRadioButton *button_local;
    QRadioButton *button_remote;
    QGroupBox *createPushButtonGroup();


private slots:
    void onClick_button1();
    void onCheck_local();
    void onCheck_remote();
};

#endif
\ifndef窗口
#定义窗口
#包括
#包括
#包括
#包括
#包括
#包括
#包括“Backend.h”
类QGroupBox;
类窗口:公共QWidget
{
Q_对象
公众:
窗口(QWidget*parent=0);
QTcpSocket*conn;
QFile*文件;
QUrl;
后端仪器;
私人:
QRadioButton*按钮_本地;
QRadioButton*按钮和遥控器;
QGroupBox*createPushButtonGroup();
专用插槽:
单击按钮1()时无效;
void onCheck_local();
void onCheck_remote();
};
#恩迪夫
主窗口.c

#include <QtGui>

#include "mainwindow.h"

Window::Window(QWidget *parent)
    : QWidget(parent)
{
    QGridLayout *grid = new QGridLayout;
    grid->addWidget(createPushButtonGroup(), 1, 1);
    setLayout(grid);

    setWindowTitle(tr("File-Fetch App"));
    resize(480, 420);
}

QGroupBox *Window::createPushButtonGroup()
{

    QGroupBox *groupBox = new QGroupBox();

    QPushButton *pushButton1 = new QPushButton(tr("Fetch Files!!"));

    button_local = new QRadioButton(tr("&Download Files from Local Storage"));
    button_remote = new QRadioButton(tr("&Download Files from a Web-Server"));
    button_local->setChecked(1);


    connect(pushButton1,SIGNAL(clicked()), this, SLOT(onClick_button1()));

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(pushButton1);
    vbox->addSpacing(50);
    vbox->addWidget(button_local);
    vbox->addWidget(button_remote);
    vbox->addStretch(1);
    groupBox->setLayout(vbox);

    return groupBox;
}

void Window::onClick_button1()
{
    QTextStream out(stdout);
    out << "fetch button clicked\n";
    if (button_local->isChecked()){
        onCheck_local();
    }
    else if (button_remote->isChecked()){
         onCheck_remote();
    }

}
void Window::onCheck_local()
{

    QTextStream out(stdout);
    out << "local update button checked\n";

}
void Window::onCheck_remote()
{
    QTextStream out(stdout);
    out << "remote update button checked\n";
    QString pathname= "http://192.168.1.1:8000/example.txt";
    QUrl webaddr = pathname;
   backend_inst.FetchFile(webaddr);
}
#包括
#包括“mainwindow.h”
窗口::窗口(QWidget*父窗口)
:QWidget(父项)
{
QGridLayout*grid=新的QGridLayout;
grid->addWidget(createPushButtonGroup(),1,1);
设置布局(网格);
setWindowTitle(tr(“文件获取应用”);
调整大小(480420);
}
QGroupBox*窗口::createPushButtonGroup()
{
QGroupBox*groupBox=新的QGroupBox();
QPushButton*pushButton1=新的QPushButton(tr(“获取文件!!”));
button_local=new QRadioButton(tr(“&Download Files from local Storage”);
button_remote=new QRadioButton(tr(“从Web服务器下载文件”);
按钮\u local->setChecked(1);
连接(按钮1,信号(点击()),此,插槽(点击按钮1());
QVBoxLayout*vbox=新的QVBoxLayout;
vbox->addWidget(按钮1);
vbox->addspace(50);
vbox->addWidget(按钮\本地);
vbox->addWidget(按钮\远程);
vbox->addStretch(1);
groupBox->setLayout(vbox);
返回分组框;
}
void Window::onClick_button1()
{
QTextStream out(标准输出);
out isChecked()){
onCheck_local();
}
否则,如果(按钮\u remote->isChecked()){
onCheck_remote();
}
}
void Window::onCheck_local()
{
QTextStream out(标准输出);

out要使用信号和插槽,您的类(信号和插槽)必须派生自QObject,即

#include "mainwindow.h"

#include <QObject>

class Backend : public QObject
{
    Q_OBJECT
public:
    Backend(QObject* parent=0);

[...]

Backend::Backend(QObject* parent)
    : QObject(parent)
{
}
#包括“mainwindow.h”
#包括
类后端:公共QObject
{
Q_对象
公众:
后端(QObject*parent=0);
[...]
后端::后端(QObject*parent)
:QObject(父对象)
{
}

要使用信号和插槽,您的类(信号和插槽)必须派生自QObject,即

#include "mainwindow.h"

#include <QObject>

class Backend : public QObject
{
    Q_OBJECT
public:
    Backend(QObject* parent=0);

[...]

Backend::Backend(QObject* parent)
    : QObject(parent)
{
}
#包括“mainwindow.h”
#包括
类后端:公共QObject
{
Q_对象
公众:
后端(QObject*parent=0);
[...]
后端::后端(QObject*parent)
:QObject(父对象)
{
}
您发布了以下内容:

class Backend
{
    // Q_OBJECT
public:

    Backend();
    void FetchFile(QUrl fpath);

public slots:
    void getBytesFromFile();

private:
    QNetworkReply *reply;
    QNetworkAccessManager qnam;

};
Q_对象
如果是,则仍会被注释删除。您正在使用信号和插槽

编辑: 尽量避免圆形夹杂: 您在mainwindow和viceversa中包含了后端。

您发布了以下内容:

class Backend
{
    // Q_OBJECT
public:

    Backend();
    void FetchFile(QUrl fpath);

public slots:
    void getBytesFromFile();

private:
    QNetworkReply *reply;
    QNetworkAccessManager qnam;

};
Q_对象
如果是,则仍会被注释删除。您正在使用信号和插槽

编辑: 尽量避免圆形夹杂:
您在mainwindow和viceversa中包括了后端。

注释掉的行:

qnam = new QNetworkAccessManager;
QObject::connect(&qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(getBytesFromFile()));
是什么导致了您的问题。Connect是指针,而不是指向指针的指针。
qnam
是指针是以前版本代码中的指针,使用运算符地址会将其转换为指向指针的指针。第二个错误是,您的信号和插槽需要具有相同的签名才能获取它调用了(否则会出现运行时错误)。因此,正确地说:

connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(getBytesFromFile(QNetworkReply*)));
(显然,更改
getBytesFromFile
方法的实际签名)


至于为什么尽管注释了代码,错误仍然存在:我认为您运行的是旧版本,而新版本由于vtable问题而无法生成(如您在注释线程中所述)。我的猜测是qmake出现了故障,这是我在将Q_对象宏添加到现有类时遇到的。请转到生成文件夹并删除Makefile*everywhere。然后返回Qt creator并重建项目,这将迫使qmake再次生成Makefiles。

注释掉的行:

qnam = new QNetworkAccessManager;
QObject::connect(&qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(getBytesFromFile()));
是什么导致了您的问题。Connect是指针,而不是指向指针的指针。
qnam
是指针是以前版本代码中的指针,使用运算符地址会将其转换为指向指针的指针。第二个错误是,您的信号和插槽需要具有相同的签名才能获取它调用了(否则会出现运行时错误)。因此,正确地说:

connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(getBytesFromFile(QNetworkReply*)));
(显然,更改
getBytesFromFile
方法的实际签名)


至于为什么尽管注释了代码,错误仍然存在:我认为您运行的是旧版本,而新版本由于vtable问题而无法生成(如您在注释线程中所述)。我猜qmake出现了故障,这是我在将Q_对象宏添加到现有类时遇到的。请转到生成文件夹并删除Makefile*everywhere。然后返回Qt creator并重建项目,这将迫使qmake再次生成Makefiles。

似乎您在生成机制方面遇到了一些问题nism。已发布代码,未发表评论 QObject::connect(&qnam,SIGNAL(finished(QNetworkReply*)),this,SLOT(getBytesFromFile());在Backend::FetchFile函数中,您的所有代码都有效。运行并选中“从我们下载文件”