2014-11-15 43 views
6

我想在我的程序中使用信号和插槽,但不幸的是,它们应该用于传输几种不同的数据类型(例如QString,double等),我不想写20个不同的插槽,因为我需要一个为每个数据类型。但是,当我要声明一个槽状如何使用带有QT信号和插槽的模板?

template <typename t> 
void Slot1(t data); 

QT告诉我,这是不可能的信号和槽使用模板。有没有解决方法?或者我的方法是否可以改进?

+2

有关使用'QVariant'什么? – sjdowling

+0

看起来很有趣,但从未听说过它! –

回答

9

准确的答案:It is impossible

解决方法:你可以做这样的事情有新的信号和槽语法:

QSlider *slid = new QSlider; 
QLineEdit *lne = new QLineEdit; 

connect(slid,&QSlider::valueChanged,this,&MainWindow::random); 
connect(lne,&QLineEdit::textChanged,this,&MainWindow::random); 
lne->show(); 
slid->show(); 

插槽:

void MainWindow::random(QVariant var) 
{ 
    qDebug() << var; 
} 

输出:

QVariant(int, 11) 
QVariant(int, 12) 
QVariant(int, 13) 
QVariant(int, 14) 
QVariant(int, 16) 
QVariant(QString, "c") 
QVariant(QString, "cv") 
QVariant(QString, "cvb") 
QVariant(QString, "cvbc") 
QVariant(QString, "cvbcv") 

为什么? http://qt-project.org/wiki/New_Signal_Slot_Syntax

可能性自动转换的类型,如果有隐式 转换(例如,从QString时,的QVariant)

+1

这完全没有回答这个问题。 :( –

+1

@ Jean-MichaëlCelerier它比回答更好,因为简单的答案是“这是不可能的”另外OP问:“是否有解决方法?或者我的方法是否简单改进?”我的答案解释了如何实现类似于模板。http://chernobyllab.blogspot.com/2015/04/how-to-use-templates-with-qt-signals.html – Chernobyl