gpt4 book ai didi

c++ - Qt:从 button_click 返回 main

转载 作者:行者123 更新时间:2023-11-28 03:06:40 27 4
gpt4 key购买 nike

如您所见(如果您查看我之前的一些问题),我对 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;
}

主要.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() 返回的内容。

如何制作这样的东西?

更新:嗯,这样不行

QString mypath = test->ui.pushButton();

附言

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

最佳答案

您可以发出信号,表明已选择新路径并将其连接到另一个组件的插槽以加载此文件。有了这个,你可以获得 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));

关于c++ - Qt:从 button_click 返回 main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19509467/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com