正如你所发现的(如果你看一下我之前的一些问题)我对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
?
答案 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));