場景
界面上,鈔票寬度以列表形式顯示,點擊曲線圖,彈出鈔票寬度的曲線圖。
曲線圖上,要求鼠標點在數據項時,可以顯示數據的信息,比如測試名稱,命令名稱,鈔票索引號,寬度值。
在循環測試下可以產生鈔票寬度數據,在單命令測試也可以產生鈔票寬度數據,在歷史數據查詢中,也會有寬度數據,這些寬度數據都會有一個寬度曲線圖。
在視線中,寬度曲線圖是一個類,循環測試,單命令測試,歷史數據查詢分別對應三個不同的類,如何從不同的類中獲取數據的提示信息呢?
解決方案
繼承機制
循環測試,單命令測試,歷史數據查詢三個類從一個數據源類中繼承過來,該數據源類定義一個獲取數據信息的虛函數,三個子類實現自己的函數。
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