2014-11-15 4 views
6

Я хочу использовать сигналы и слоты в своей программе, но, к сожалению, они должны использоваться для передачи нескольких разных типов данных (например, QString, double и т. Д.), И я не хочу писать двадцать разных слотов только потому, что мне нужен один для каждого типа данных. Но когда я хочу объявить слот какКак использовать шаблоны с сигналами 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(); 

Slot:

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 Это лучше, чем ответ, потому что простой ответ: «Это невозможно». Также ОП спросил: «Есть ли обходной путь? Или мой подход просто улучшился?» И мой ответ объясняет, как добиться чего-то похожего на шаблон http://chernobyllab.blogspot.com/2015/04/how-to-use-templates-with-qt-signals.html – Chernobyl

Смежные вопросы