QObject :: connection(const QObject *,const char *,const char *,Qt :: ConnectionType)"无法从' fileProcessor'转换参数3到const QObject *"

时间:2014-11-06 03:05:15

标签: c++ qt signals slots

我需要类似QObject的p实例,我已经扩展了QObject并在fileprocessor.h中定义了关键字Q_OBJECT,我不知道还能做什么。

- Fileprocessor.h

#ifndef FILEPROCESSOR_H
#define FILEPROCESSOR_H
#include <QMainWindow>
#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QStandardItemModel>
#include <QObject>

class fileProcessor: public QObject
{
    Q_OBJECT
public:
    fileProcessor();
public slots:
    void on_action_Open_triggered();
    void checkString(QString &temp, QChar ch = 0);

public:
QList<QStringList> csv;
QStandardItemModel *model;
QList<QStandardItem*> standardItemList;
};


#endif // FILEPROCESSOR_H

- 的 Mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "fileProcessor.h"

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    fileProcessor p;
    ui->setupUi(this);
    QObject::connect(ui->Open, SIGNAL(clicked()),
                     p,SLOT(on_action_Open_triggered()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

- 的 Mainwindow.cpp

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QStandardItemModel>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();


public:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

错误:

  

C:\ Qt的\ Qt5.3.2 \工具\ QtCreator \ BIN \ Assignment3 \ mainwindow.cpp:10:   错误:C2664:&#39; QMetaObject :: Connection QObject :: connect(const QObject   *,const char *,const char *,Qt :: ConnectionType)const&#39; :无法从&#39; fileProcessor&#39;转换参数3 to&#39; const QObject *&#39;没有   可以执行此操作的用户定义转换运算符   转换,或者不能调用运算符

1 个答案:

答案 0 :(得分:2)

编译器在此行中的含义

  

无法将参数3从'fileProcessor'转换为'const QObject *'

是您将对象而不是指针传递给对象。

所以你需要做的就是获得一个指针指向p的&符号,就像这样,对吗?

fileProcessor p;
ui->setupUi(this);
QObject::connect(ui->Open, SIGNAL(clicked()),
                 &p,SLOT(on_action_Open_triggered()));

它会编译,但不起作用。

为什么呢?你的变量p将超出范围并在构造函数的末尾被销毁,因此无法调用它的插槽。

最直接的解决方案是将p声明为MainWindow类的成员变量。这样,只要MainWindow存在,你的fileProcessor就会存在。