Как вы можете заметить (если вы посмотрите на несколько моих предыдущих вопросов), я довольно новичок в 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
?
Вы можете подать сигнал о том, что был выбран новый путь, и подключить его к слоту другого компонента для загрузки этого файла. С этим вы можете получить Слабая связь между классами.
Сигналы такие: «Эй, что-то случилось. Но мне все равно, кого это волнует».
Слоты как: «Я делаю эту работу, но мне все равно, кто хочет, чтобы я это делал».
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));
Других решений пока нет …