场景
界面上,钞票宽度以列表形式显示,点击曲线图,弹出钞票宽度的曲线图。
曲线图上,要求鼠标点在数据项时,可以显示数据的信息,比如测试名称,命令名称,钞票索引号,宽度值。
在循环测试下可以产生钞票宽度数据,在单命令测试也可以产生钞票宽度数据,在历史数据查询中,也会有宽度数据,这些宽度数据都会有一个宽度曲线图。
在视线中,宽度曲线图是一个类,循环测试,单命令测试,历史数据查询分别对应三个不同的类,如何从不同的类中获取数据的提示信息呢?
解决方案
继承机制
循环测试,单命令测试,历史数据查询三个类从一个数据源类中继承过来,该数据源类定义一个获取数据信息的虚函数,三个子类实现自己的函数。
QT信号槽
以Q表示曲线图类,以D表示循环测试/单命令测试/历史数据查询类,交互过程如下
1)Q 发出 GET_DATA_INFO 信号
2)D 响应 Q::GET_DATA_INFO 信号,整理好数据信息, 发出 DATA_INFO_DONE 信号
3)Q 响应 D::DATA_INFO_DONE信号,保存数据信息到本地;
4)Q 读取本地保存的数据信息并显示
此方案使用了在UI主界面中信号槽是按顺序执行的。但是,处理流程过于冗长;
C++11 bind
std::bind可以绑定任意类的某一类型函数。可以参照下面示例理解
#include <iostream>
#include <functional>
using namespace std;
typedef std::function<std::string (int)> fpi;
class View
{
public:
View(){}
void show(int idx){
std::cout<<m_func(idx)<<"\n";
}
void setFunc(fpi func)
{
m_func = func;
}
protected:
fpi m_func;
};
class Data{
public:
Data(){}
string getDesc(int idx)
{
return std::to_string(idx);
}
};
void test2()
{
View view;
Data data;
fpi fpGetDesc = std::bind(&Data::getDesc, &data, std::placeholders::_1);
view.setFunc(fpGetDesc);
view.show(0);
view.show(4444);
}
int main()
{
test2();
return 0;
}
结果如下
g++ -o test bindtest.cpp
$ ./test.exe
0
4444
这种方法更为灵活。
引用
https://blog.csdn.net/tieshuxianrezhang/article/details/80635508