Qt 对象通信
我制作了一个简单的货币转换器,在课堂交流中遇到了一些问题 我有一个用于下载汇率的类,它将值保存到一个文本文件中,还有一个用于解析文件并将值保存在一个QMap中的类,我在main中对其进行了解析。 我不会发布downloader和parser类,因为它们按预期工作Qt 对象通信,qt,c++11,Qt,C++11,我制作了一个简单的货币转换器,在课堂交流中遇到了一些问题 我有一个用于下载汇率的类,它将值保存到一个文本文件中,还有一个用于解析文件并将值保存在一个QMap中的类,我在main中对其进行了解析。 我不会发布downloader和parser类,因为它们按预期工作 int main(int argc, char *argv[]) { QApplication a(argc, argv); QMap<QString,double> currency_map; downloader
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMap<QString,double> currency_map;
downloader d;
d.Do_download();
//do the downloading
MainWindow w(currency_map);
w.show();
//make the main window and send the map into it.
parser p;
p.read_line(currency_map);
//parsing the file and saving the values.
p.print_map(currency_map);
//test to see if my values are saved.
Calculator c(currency_map, w);
// cannot convert parameter 1 from 'QMap<Key,T>' to 'QMap<Key,T>'* is the error i get
return a.exec();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);
货币地图;
下载器d;
d、 下载()吗;
//下载
主窗口w(货币地图);
w、 show();
//制作主窗口并将地图发送到其中。
语法分析器p;
p、 读线(货币地图);
//解析文件并保存值。
p、 打印地图(货币地图);
//测试以查看是否保存了我的值。
计算器c(货币地图,w);
//无法将参数1从“QMap”转换为“QMap”*是我得到的错误
返回a.exec();
}
我的计算器
#include <QObject>
#include <QString>
#include <QDebug>
#include <ui_mainwindow.h>
#include "MainWindow.h"
class Calculator
{
public:
explicit Calculator(QMap <QString, double> *my_map, Ui::MainWindow &window);
void get_value(QString value);
private:
Ui::MainWindow *ui;
QMap <QString, double> *map_pointer;
double x , y;
};
#包括
#包括
#包括
#包括
#包括“MainWindow.h”
类计算器
{
公众:
显式计算器(QMap*my_map,Ui::MainWindow和window);
void get_值(QString值);
私人:
Ui::MainWindow*Ui;
QMap*map\u指针;
双x,y;
};
和calculator.cpp
#include "calculator.h"
Calculator::Calculator(QMap<QString, double> *my_map, Ui::MainWindow *window)
{
map_pointer = my_map;
this->ui= window;
//I get a overloaded member function not found in calculator
}
void Calculator::get_value(QString value)
{
for(QMap<QString, double>::Iterator i = map_pointer->begin();i != map_pointer->end();i++)
{
if(i.key() == value)
{
qDebug()<<i.key() << ": " << i.value();
}
}
}
#包括“calculator.h”
计算器::计算器(QMap*my_map,Ui::MainWindow*window)
{
映射指针=我的映射;
这个->用户界面=窗口;
//我得到了计算器中找不到的重载成员函数
}
无效计算器::获取_值(QString值)
{
对于(QMap::迭代器i=map\u-pointer->begin();i!=map\u-pointer->end();i++)
{
如果(i.key()==值)
{
qDebug()到\u Combox->addItems(检索\u列表(¤cy\u解析器));
}
QStringList主窗口::检索_列表(解析器*p)
{
返回p->币种列表;
}
MainWindow::~MainWindow()
{
删除用户界面;
删除计算;
}
其想法是在主地图中有一个汇率图,用解析器类中的数据填充它
然后使用calculator类计算所需的值。
我有一个“计划”将地图和一个指向mainwindow对象的指针一起发送到类中,这样calculator类就可以在mainwindow对象中的显示小部件中显示结果,但我无法找出我在这里遗漏了什么
如果有人能给我举个例子,告诉我如何在这里使用信号和插槽进行通信,我将不胜感激。为什么要在
main
和main窗口中创建计算器对象呢?
?当你将QMap货币映射作为指针复制到其他地方时,你会在某些地方传递它。
不知道发生了什么。你的设计很差。你的计算器类应该就是这样。一个计算器。它不应该关心任何UI内容。因此没有理由向它传递UI::MainWindow
指针。我在main中创建了Calculator对象,所以我在应用程序中有一个,在main窗口中我创建了一个poi进入对象,因为我只想把一个指针传递到主窗口。我知道你是怎么说设计缺陷的,但我对OOP有点缺乏经验,这就是我认为信号和插槽应该派上用场的地方。关于我的代码的一个例子对我很有帮助。为什么你要将Ui传递并存储到计算器类?如果你没有,很难说我假设Calculator::get_value
应该返回一个值。当你需要计算一些东西时,你只需在main窗口中调用这个函数。我可以想象Calculator
类也应该计算货币的值。因此它应该有一个函数,你可以在其中传递e原始值,即要从哪种货币转换为哪种货币,然后返回最终值。此处不需要信号或插槽。此外,您没有将main
中Calculator
对象的指针传递到main窗口
类。您只需创建一个新的Calculator
实例还有,QStringList主窗口::retrieve_list(parser*p)
函数的存在让我感到困惑。为什么不在调用retrieve_list
的地方调用currency_parser->currency_list
?
#include <QMainWindow>
#include <ui_mainwindow.h>
#include "parser.h"
#include "calculator.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QMap<QString, double> currency_map, QWidget *parent = 0);
QStringList retrieve_list(parser *p);
~MainWindow();
private slots:
void on_convert_button_clicked();
void on_from_Combox_currentIndexChanged(const QString &arg1);
void on_to_Combox_currentIndexChanged(const QString &arg1);
signals:
private:
Ui::MainWindow *ui;
Calculator *calc; //missing type specifier
parser currency_parser;
};
#include "mainwindow.h"
MainWindow::MainWindow(QMap<QString, double> currency_map, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
calc = new Calculator(currency_map,ui);
//missing type specifier
ui->from_Combox->addItems(retrieve_list(¤cy_parser));
ui->to_Combox->addItems(retrieve_list(¤cy_parser));
}
QStringList MainWindow::retrieve_list(parser *p)
{
return p->currency_list;
}
MainWindow::~MainWindow()
{
delete ui;
delete calc;
}