Qt: возврат в главное из button_click

Как вы можете заметить (если вы посмотрите на несколько моих предыдущих вопросов), я довольно новичок в Qt. Я делаю модуль «чтение из файла Excel из файла 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();

Постскриптум

Да, и между прочим, я не уверен, как я degin этот модуль.
Может быть, я должен переместить все рабочие вещи из main.cpp в FB_test.cpp и получить, какая кнопка возвращается туда и только позвонить show() в main.cpp?

0

Решение

Вы можете подать сигнал о том, что был выбран новый путь, и подключить его к слоту другого компонента для загрузки этого файла. С этим вы можете получить Слабая связь между классами.

Сигналы такие: «Эй, что-то случилось. Но мне все равно, кого это волнует».

Слоты как: «Я делаю эту работу, но мне все равно, кто хочет, чтобы я это делал».

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

Обратите внимание, что fbTest в main не выделяется динамически с new, потому что это приведет к утечке памяти при завершении main. excelClass объект получит указатель на объект fbTest в своем конструкторе, это гарантирует, что excelClass будет удален как дочерний объект fbTest,

Если и сигнал, и слот будут в одном классе, вы должны соединить их в конструкторе следующим образом:

connect(this, SIGNAL(newPathSelected(QString)),
this, SLOT(readExcelSheet(QString));
2

Другие решения

Других решений пока нет …