SIGNAL Vererbung, bzw von der Elternklasse abfangen

Alles rund um die Programmierung mit Qt
Antworten
langersteff
Beiträge: 3
Registriert: 6. Oktober 2010 14:09

SIGNAL Vererbung, bzw von der Elternklasse abfangen

Beitrag von langersteff »

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 (

Code: Alles auswählen

QComboBox *pBox = dynamic_cast <QComboBox*> (this);
) 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:

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;



};
Vielen Dank schonmal im Vorraus fuer eure Bemuehungen! :)

Steff[/code]
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Ich verstehe weder deine Absicht(*) noch dein Proble 100% aber vielleicht hilfts ja trozdem:

Du kannst Signale an andere Signale connecten ...

Code: Alles auswählen

connect(QComboBox,SIGNAL(wasauchimmer), QComboTabel, SIGNAL(wasauchimmer))
und Signale wieder disconnecten

Code: Alles auswählen

disconnect ( const QObject *, const char *, const QObject *, const char * ) : bool
disconnect ( const char *, const QObject *, const char * ) : bool
disconnect ( const QObject *, const char * ) : bool
edit: (*) Du ersetzt einen Knopf mit Popupliste durch ein 2dim Tabelle? Also ne Liste durch ne Tabelle ... **wunder**
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Disconnecten hilft wenig, da er das emitten der alten, unerwünschten Signale nicht unterbinden kann. Im Endeffekt muss er sowieso alles neuimplementieren, was QComboBox implementiert (mouse-events, key-events, Text anzeigen, ...).

Ergo: Schreib dir eine komplett eigene Klasse, von QWidget abgeleitet. Spicken bei QComboBox kannst du natürlich, Zeichnen kannst du mit dem style(), damit dein Control wie ne ComboBox ausschaut.
langersteff
Beiträge: 3
Registriert: 6. Oktober 2010 14:09

Beitrag von langersteff »

Sorry dass ich erst jetzt wieder antworten kann! :(

@ padreigh:

Das Signal mit einem weiteren Signal zu connecten hilft mir leider nicht, da ich kein neu benanntes Signal haben moechte. Zudem wuerde ich bereits vom ersten Signal einen falschen Index bekommen.

Ein disconnect bringt mich auch nicht weiter!:(

@ franzf:

Vieles muss ich neu implementieren, einiges funktioniert aber auch ohne. Momentan haenge ich nur noch an den Signals und haette gehofft eine saubere Loesung zu finden, ohne alles neu schreiben zu muessen! :(

Gibt es keine Moeglichkeit das Signal der Elternklasse (QComboBox), trotz gleicher Benennung, getrennt von dem Signal meiner ComboTable Klasse, zu behandeln?!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Nein
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
langersteff
Beiträge: 3
Registriert: 6. Oktober 2010 14:09

Beitrag von langersteff »

Okay...klare Aussage wuerde ich an dieser Stelle mal behaupten! ;)
Antworten