Qt:从button_click返回main

时间:2013-10-22 05:12:56

标签: c++ qt module qt4 buttonclick

正如你所发现的(如果你看一下我之前的一些问题)我对Qt很新。我正在制作“从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();

P.S。

哦,顺便说一句,我不确定我这个模块的设计方式。 也许我应该将所有工作内容从main.cpp移到FB_test.cpp并在那里返回什么按钮,只在show()中调用main.cpp

1 个答案:

答案 0 :(得分:2)

您可以发出信号,选择新路径并将其连接到另一个组件的插槽以加载此文件。这样,您可以在课程之间获得loose coupling

信号就像:“嘿,有些事情已经发生了变化。但是关于谁在乎这件事并不重要”。

插槽就像:“我做那个工作,但我不在乎谁想要我这样做。”

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