Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 对象通信_Qt_C++11 - Fatal编程技术网

Qt 对象通信

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

我制作了一个简单的货币转换器,在课堂交流中遇到了一些问题

我有一个用于下载汇率的类,它将值保存到一个文本文件中,还有一个用于解析文件并将值保存在一个QMap中的类,我在main中对其进行了解析。 我不会发布downloader和parser类,因为它们按预期工作

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(&currency_parser));
    ui->to_Combox->addItems(retrieve_list(&currency_parser));

}

QStringList MainWindow::retrieve_list(parser *p)
{
    return p->currency_list;
}

MainWindow::~MainWindow()
{

    delete ui;
    delete calc;
}