定义模板类,这是一个数值显示label:
template<typename T>
class ValueLabel : public QLabel
{
public:
explicit ValueLabel(QWidget *parent = nullptr)
: QLabel(parent),tValue(0),dot(1){}
void setValue(const T val)
{
tValue = val;
QString type(typeid (tValue).name());
//if(dot > 0){
//浮点类型判断小数点位数
if(0 == type.compare("d",Qt::CaseInsensitive)
|| 0 == type.compare("f",Qt::CaseInsensitive)){
QLabel::setText(QString::number(tValue,'0',dot));
}else {
QLabel::setText(QString::number(tValue));
}
}
//小数点位数设置
void setDot(int num){
dot = num;
setValue(tValue);
}
protected:
T tValue;
int dot;
};
定义模板函数:
template<typename T>
void updateValue(QWidget *valueWidget,QVariant v)
{
ValueLabel<T> *wValue = static_cast<ValueLabel<T> *>(valueWidget);
if(wValue){
wValue->setValue(v.value<T>());
}
}
使用模板函数对模板类进行操作:
//模板类的调用
ValueLabel<int> *valint = new ValueLabel<int>();
ValueLabel<double>*valdouble = new ValueLabel<double>();
//模板函数的调用
QVariant v;//使用的值
QWidget *valueWidget;//使用到的模板标签
//........
switch (v.type()) {
case QVariant::UInt:{
updateValue<uint>(valueWidget,v);
}break;
case QVariant::Int:{
updateValue<int>(valueWidget,v);
}break;
case QVariant::Double:{
updateValue<double>(valueWidget,v);
}break;
default:
break;
}