SIGNAL Vererbung, bzw von der Elternklasse abfangen
Verfasst: 7. Oktober 2010 09:40
Hallo erstmal, bin neu hier im QtForum. Habe mich schon umfassend mit meinem Problem befasst und recherchiert, jedoch nichts gefunden.
Im Vorfeld eine kurze Beschreibung meines Problems:
Ich habe meine eigene Klasse ComboTable erstellt, welche von QComboBox erbt und das Ziel hat eine QComboBox mit einer QTableView darzustellen. Da ich in einem umfangreichen Programm QComboBox Widgets einfach (ohne weitere Bearbeitung des Programms) durch meine ComboTable Widgets ersetzen moechte muss ich einige Methoden ueberschreiben. Hauptproblem ist die richtige Berechnung des Indexes, da QComboBox nur eine Spalte kennt und somit immer QModelIndex::row() als den Index(int) angibt. Sehr viele Funktionen habe ich bereits ueberschrieben, bei den Signals habe ich jedoch ein Problem:
QComboBox sendet das SIGNAL activated ( int ) und activated ( QString ) aus.
activated ( int ) gibt jedoch den falschen Index zurueck (warum, siehe oben).
Ein eigenes Signal kommt nicht in Frage, da ich Signals und somit activated(int) nicht auf privat setzen kann um die Nutzbarkeit dieses Signals einzuschraenken. Zudem moechte ich wie gesagt QComboBox einfach durch QComboTable ersetzen koennen.
activated ( int ) zu ueberschreiben, activated ( QString ) abzufangen und somit activated ( int ) neu zu berechnen und auszuloesen kommt nicht in Frage, da es eventuell mehrere Elemente mit selbem QString geben kann.
Meine Idee waere gewesen das Signal activated(int) in meiner Klasse zu ueberschreiben, das Signal der Elternklasse mittels eines Pointers auf QComboBox () per connect abzufangen und somit einen Slot auszuloesen, der wiederrum activated ( int ) meiner eigenen Klasse ausloest... funktioniert leider nicht 
Eine Art super() gibt es ja leider auch nicht und QComboBox::activated( int ) kann ich leider auch nicht als SIGNAL angeben...
Hier mal mein (stark verinfachter) Code, ich hoffe die wichtigen Details sind vorhanden und m,eine Beschreibung ist detailliert genug:
Vielen Dank schonmal im Vorraus fuer eure Bemuehungen! 
Steff[/code]
Im Vorfeld eine kurze Beschreibung meines Problems:
Ich habe meine eigene Klasse ComboTable erstellt, welche von QComboBox erbt und das Ziel hat eine QComboBox mit einer QTableView darzustellen. Da ich in einem umfangreichen Programm QComboBox Widgets einfach (ohne weitere Bearbeitung des Programms) durch meine ComboTable Widgets ersetzen moechte muss ich einige Methoden ueberschreiben. Hauptproblem ist die richtige Berechnung des Indexes, da QComboBox nur eine Spalte kennt und somit immer QModelIndex::row() als den Index(int) angibt. Sehr viele Funktionen habe ich bereits ueberschrieben, bei den Signals habe ich jedoch ein Problem:
QComboBox sendet das SIGNAL activated ( int ) und activated ( QString ) aus.
activated ( int ) gibt jedoch den falschen Index zurueck (warum, siehe oben).
Ein eigenes Signal kommt nicht in Frage, da ich Signals und somit activated(int) nicht auf privat setzen kann um die Nutzbarkeit dieses Signals einzuschraenken. Zudem moechte ich wie gesagt QComboBox einfach durch QComboTable ersetzen koennen.
activated ( int ) zu ueberschreiben, activated ( QString ) abzufangen und somit activated ( int ) neu zu berechnen und auszuloesen kommt nicht in Frage, da es eventuell mehrere Elemente mit selbem QString geben kann.
Meine Idee waere gewesen das Signal activated(int) in meiner Klasse zu ueberschreiben, das Signal der Elternklasse mittels eines Pointers auf QComboBox (
Code: Alles auswählen
QComboBox *pBox = dynamic_cast <QComboBox*> (this);Eine Art super() gibt es ja leider auch nicht und QComboBox::activated( int ) kann ich leider auch nicht als SIGNAL angeben...
Hier mal mein (stark verinfachter) Code, ich hoffe die wichtigen Details sind vorhanden und m,eine Beschreibung ist detailliert genug:
Code: Alles auswählen
//combotable.cpp
ComboTable::ComboTable(QWidget *parent) :
QComboBox(parent)
{
view = new QTableView();
updateTable();
this->setView(view);
view->horizontalHeader()->hide();
view->verticalHeader()->hide();
view->setSelectionMode(QAbstractItemView::SingleSelection);
actLock=false;
QComboBox *pBox = dynamic_cast <QComboBox*> (this);
connect( pBox, SIGNAL(activated(int)), this, SLOT(emitActivated()));
}
void ComboTable::emitActivated()
{
if(actLock)
return;
actLock=true;
qDebug() << "TEXT" << currentText() << endl;
emit activated(currentText());
emit activated(currentIndex());
actLock=false;
}
//combotable.h
class ComboTable : public QComboBox
{
Q_OBJECT
public:
explicit ComboTable(QWidget *parent = 0);
signals:
void itemsEdited();
void activated ( int index );
void activated ( QString text )
protected:
void wheelEvent(QWheelEvent *e);
// void _q_emitCurrentIndexChanged(const QModelIndex &index);
// void _q_emitHighlighted(const QModelIndex &index);
protected slots:
void emitActivated();
private:
static QList <Item> items;
QTableView *view;
int columns;
bool returnZero;
QModelIndex currentIndex_;
TableModel *model;
QLineEdit *line;
void insertSeparator(int index){}
bool actLock;
};
Steff[/code]