0

ご覧のとおり (私の以前の質問のいくつかを参照すると)、私は Qt を初めて使用します。「read-from-excel-file-push-to-some-DB」モジュールを作成しています。

プッシュボタンが戻るパスを取得したい main.cpp

つまり、簡単に言うと、私のコードは次のとおりです。

fb_test.h

#ifndef FB_TEST_H
#define FB_TEST_H

#include <QtGui/QMainWindow>
#include "ui_fb_test.h"

class FB_test : public QMainWindow
{
    Q_OBJECT

public:
    FB_test(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~FB_test();

private:
    Ui::FB_testClass ui;

public slots:
    QString on_pushButton_clicked();

};

#endif // FB_TEST_H

fb_test.cpp

#include <QtGui>
#include "fb_test.h"

FB_test::FB_test(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);

}

FB_test::~FB_test()
{

}

QString FB_test::on_pushButton_clicked()
{
    QString path;

    path = QFileDialog::getOpenFileName(
        this,
        "Choose a file to open",
        QString::null,
        QString::null);

    return path;
}

main.cpp

    #include <QApplication>
    #include <QtGui>
    #include <QtSql>
    #include <QAxObject>
    #include <QAxWidget>
    #include "fb_test.h"

    bool initExcel(QAxObject* &excelApp);
    void getTableHeaders(QAxObject* _worksheet, QAxObject*  _excel);
    bool readExcelFile(QAxObject* excel, QString& file_path, QString& selected_list);
    void getTableHeaders(QAxObject* _worksheet, QAxObject*  _excel);

    //....
    //here's methods above implementation 
    //....
    void excelTest(){
        QAxObject* excel;

        QString path = QString("C:\\databases\\oilnstuff.xls");//gonna use GUI choose
        QString list = QString("list1");

        if(initExcel(excel)){
            if (readExcelFile(excel, path, list)){
                //
            }else{
                //error output
            }
        }

        excel->dynamicCall("Quit");
        delete excel;
    }

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QComboBox myCombo;

    FB_test *test = new FB_test;
    test->show();


    excelTest();

    return app.exec();
}

ここでは、そのような右側の部分の代わりに QString path = QString("C:\\databases\\oilnstuff.xls");

QString FB_test::on_pushButton_clicked()返ってきたものを取得したい。

そんなものどうやって作るの?

UPD:まあ、そのような方法は機能しません

QString mypath = test->ui.pushButton();

PS

ああ、ところで、このモジュールをどのように定義するかはわかりません。たぶん、すべての作業内容をに移動しmain.cppFB_test.cppそこに返されるボタンを取得して、呼び出すだけにする必要がありますshow()main.cpp?

4

1 に答える 1

2

新しいパスが選択されたという信号を発し、このファイルをロードするために別のコンポーネントのスロットに接続することができます。これにより、クラス間の疎結合を取得できます。

シグナルは次のようなものです。

スロットは、「私はその仕事をしますが、誰が私にそれをしてほしいかは気にしません」.

fb_test.h

class FB_test : public QMainWindow
{
    Q_OBJECT

public:
    FB_test(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~FB_test();

signals:
    void newPathSelected(const QString& path);

private:
    Ui::FB_testClass ui;

public slots:
    void on_pushButton_clicked();

};

fb_test.cpp

// ...
void FB_test::on_pushButton_clicked()
{
    QString path;

    path = QFileDialog::getOpenFileName(
        this,
        "Choose a file to open",
        QString::null,
        QString::null);

    if (!path.isEmpty())
        emit newPathSelected(path);
}

Excel クラスは次のようになります。

class MyExcelClass : public QObject
{
    Q_OBJECT

public:
    MyExcelClass(QObject *parent = 0);
    ~MyExcelClass();

public slots:
    void readExcelSheet(const QString& path);
};

main.cpp に両方のクラスのインスタンスがある場合、このファイルは次のようになります。

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    FB_test fbTest;

    MyExcelClass *excelClass = new MyExcelClass(&fbTest);  


    connect(&fbTest, SIGNAL(newPathSelected(QString)),
            excelClass, SLOT(readExcelSheet(QString));

    return app.exec();
}

main の fbTest は new で動的に割り当てられないことに注意してください。これは、main の終了時にメモリ リークが発生するためです。excelClassオブジェクトは、そのコンストラクターで fbTest オブジェクトへのポインターを取得します。これにより、のexcelClass子オブジェクトとして削除されますfbTest

シグナルとスロットの両方が同じクラスにある場合は、コンストラクターでこれらを次のように接続する必要があります。

connect(this, SIGNAL(newPathSelected(QString)),
            this, SLOT(readExcelSheet(QString));
于 2013-10-22T06:41:35.273 に答える