Seite 1 von 1

SIGNAL Vererbung, bzw von der Elternklasse abfangen

Verfasst: 7. Oktober 2010 09:40
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]

Verfasst: 7. Oktober 2010 10:21
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**

Verfasst: 7. Oktober 2010 10:51
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.

Verfasst: 14. Oktober 2010 08:51
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?!

Verfasst: 14. Oktober 2010 09:36
von Christian81
Nein

Verfasst: 15. Oktober 2010 11:49
von langersteff
Okay...klare Aussage wuerde ich an dieser Stelle mal behaupten! ;)