0

タイプ 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\Tools\QtCreator\bin\Assignment3\mainwindow.cpp:10: エラー: C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt ::ConnectionType) const' : 引数 3 を 'fileProcessor' から 'const QObject *' に変換できません この変換を実行できるユーザー定義変換演算子がないか、演算子を呼び出すことができません

4

1 に答える 1

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 は存在します。

于 2014-11-06T03:24:05.833 に答える