2017-03-22 2 views
0

Hallo, ich versuche, eine Vorlage-Klasse in Qt zu schreiben, dabei tun, ich wurde mit einigen Fehlern stecken, habe ich einige Artikel lesen und fing an, ein Beispiel nach meiner AnforderungWie lösen Vorlage Problem in Qt

zu bauen

template.h

#ifndef CSLCDTEMPLATE_H 
#define CSLCDTEMPLATE_H 

#include <QDialog> 
#include <QTimer> 
#include <QDebug> 
#include <QList> 
#include <QPixmap> 
#include <QPalette> 
#include <QStringList> 


template<class T> 
class LcdTemplate : public QDialog 
{ 
public: 
    LcdTemplate(); 
    void display(T); 
    T Getalue(); 

private slots: 
    void display(); 
private: 
    int indexVal; 
    T m_Obj; 
    QStringList nameList; 
}; 

#endif 
// CSLCDTEMPLATE_H 

Template.cpp

#include "CSLcdTemplate.h" 

extern QStringList display_list; 

template <class T> 
LcdTemplate<T>::LcdTemplate() 
{ 
    qDebug()<<"Inside the Constructor of LCD Template"; 

    setWindowFlags(Qt::FramelessWindowHint); 
#ifdef GL11_QT 
    setGeometry(0,0,320,240); 
#endif 
#ifdef GL11_GNOME 
    setGeometry(2,20,316,200); 
#endif 
    setStyleSheet("background-color:yellow"); 

    indexVal = 0; 

    QTimer *timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(display())); 
    timer->start(500); 

    QTimer::singleShot(4000, this, SLOT(close())); 
} 

//template <class T> 
void LcdTemplate::display() 
{ 

    nameList = display_list; 
    qDebug()<<"Data in"<<nameList; 
    display(nameList); 

} 

template <class T> 
void LcdTemplate<T>::display(T list) 
{ 
    switch(indexVal) 
    { 
    case 0: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 1; 
     break; 
    case 1: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 2; 
     break; 
    case 2: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 3; 
     break; 
    case 4: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 4; 
     break; 
    case 5: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 0; 
     break; 
    } 
} 

template <class T> 
T TestTemp<T>::Getalue() 
{ 
    return m_Obj; 
} 

Die Fehler i bin vor sind

CSLcdTemplate.cpp:29:6: error: 'template<class T> class LcdTemplate' used without template parameters 
CSLcdTemplate.cpp: In function 'void display()': 
CSLcdTemplate.cpp:32:5: error: 'nameList' was not declared in this scope 
CSLcdTemplate.cpp: At global scope: 
CSLcdTemplate.cpp:67:11: error: expected initializer before '<' token 

Wie kann ich diese Fehler beheben.

+0

Template-Implementierung in einer cpp-Datei ??? Sehen Sie sich [hier] an (https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl). Dennoch gibt es einige begrenzte Fälle, in denen Sie dies noch tun können, aber im Allgemeinen werden Sie scheitern. – Aconcagua

Antwort

0

Die Vorlagenklasse und die für Signale und Steckplätze zuständige Klasse nicht mischen. Siehe QT : Templated Q_OBJECT class

Beachten Sie, dass die korrekte Syntax für Template-Klasse Mitglied Definition ist

template <class T> 
void LcdTemplate<T>::display() 
{} 

Beachten Sie, dass Sie benötigen die Q_OBJECT Makro als auch für die Signal- und Slots hinzufügen zu arbeiten.

+0

Ich dachte, es ist nicht möglich, ein QObject zu erstellen, das eine Vorlage ist. Hat sich das kürzlich geändert oder so? –

+0

Ich habe auch einige Artikel gelesen, während ich nach der Lösung gesucht habe, also versuche ich, das Beispiel mit der Vererbung zu erstellen, aber ich konnte auch keine Vererbung erreichen. Ich suche nach ausführlicheren Beispielen. – Mounika

+0

@Mounika mach es nicht. Können Sie herausfinden, warum Sie denken, dass Sie Erbschaft benötigen? – UmNyobe