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;
}

主文件

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

附言

哦,顺便说一句,我不确定我设计这个模块的方式。也许我应该把所有工作的东西移到main.cpp那里并FB_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 回答