QListWidget Event Problem

Alles rund um die Programmierung mit Qt
ali-g
Beiträge: 31
Registriert: 4. Dezember 2009 20:50

QListWidget Event Problem

Beitrag von ali-g »

Also Mein Problem ist, mein mousePressEvent Funktioniert irgendwie nicht

ich krieg es zwar hin mit dem EventFilter aber ich will es lieber mit mousePressEvent machen, weil es auf dem Handy mit dem EventFilter nicht Funktioniert.

Also wie gesagt mit dem eventfilter krieg ich es hin

hier ist mal der code:

Code: Alles auswählen

bool List::eventFilter(QObject *obj, QEvent *event)
{
    const QEvent::Type eventType = event->type();
    const bool isMouseAction = QEvent::MouseButtonPress == eventType
       || QEvent::MouseButtonRelease == eventType;
     bool isMouseEvent = isMouseAction || QEvent::MouseMove == eventType;
    if( !isMouseEvent )
      return false;
   if(  d->ignoredMouseActions-- > 0 ) // don't filter simulated click
      return false;





    QMouseEvent* const mouseEvent = static_cast<QMouseEvent*>(event);
    QListWidget::mousePressEvent(mouseEvent);
    switch( eventType )
    {
    case QEvent::MouseButtonPress:
        QMessageBox::about(this,"info","PRESS IN EVENTFILTER");
        list->addItem("sjdjsdj");
        break;



        QApplication::postEvent(obj,event);

    }





}




und wenn ich den bereich entferne:

Code: Alles auswählen

 const QEvent::Type eventType = event->type();
    const bool isMouseAction = QEvent::MouseButtonPress == eventType
       || QEvent::MouseButtonRelease == eventType;
     bool isMouseEvent = isMouseAction || QEvent::MouseMove == eventType;
    if( !isMouseEvent )
      return false;
   if(  d->ignoredMouseActions-- > 0 ) // don't filter simulated click
      return false;


verschwinden irgendwie die Ganzen ITEMS ??

aber es Funktioniert noch...




------------------------------------------------------------------------------------

------------------------------------------------------------------------------------


und hier mal der code von der Klasse und mousePressEvent

Code: Alles auswählen

#ifndef LIST_H
#define LIST_H

#include <QListWidget>
#include <QGridLayout>

class Impl;

class List : public QListWidget
{




public:
    List(QWidget *parent = 0);
    QListWidget *list;
   QGridLayout *layout;
   void virtual mousePressEvent(QMouseEvent *event);
   //void virtual mouseReleaseEvent(QMouseEvent *event);
   //void virtual mouseMoveEvent(QMouseEvent *event);
    //bool eventFilter(QObject *obj, QEvent *event);


Impl *d;


};

#endif // LIST_H

Code: Alles auswählen

List::List(QWidget *parent) : QListWidget(parent)

{

   

    list = new QListWidget(this);
   // layout = new QGridLayout(this);

    //layout->addWidget(list);

    char ges[1000];


   // 999 ITEMS Hinzufügen
    for (int i = 0; i < 999; i++)
    {

    sprintf(ges,"%i",i);
    list->addItem(ges);

    }


    list->viewport()->removeEventFilter(this);
    list->removeEventFilter(this);

    list->installEventFilter(this);
    list->viewport()->installEventFilter(this);




}

Code: Alles auswählen

void List::mousePressEvent(QMouseEvent *event)
{
    const QEvent::Type eventType = event->type();
    //QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);

switch(eventType)
{
case QMouseEvent::MouseButtonPress:
    {

         QMessageBox::about(this,"infO","Press");
    }

}
QListWidget::mousePressEvent(event);



}   
       
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Qt-Doku hat geschrieben: Notice in the example above that unhandled events are passed to the base class's eventFilter() function, since the base class might have reimplemented eventFilter() for its own internal purposes.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ali-g
Beiträge: 31
Registriert: 4. Dezember 2009 20:50

Beitrag von ali-g »

sorry, ich verstehs nicht ganz :oops:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du klaust dem QListWidget die events - was erwartest Du also?
Wenn man eine virtuelle Funktion überlädt sollte man schon auch die Funktion für die Basisklasse aufrufen. Vor allem wenn es noch dazu in der Doku steht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ali-g
Beiträge: 31
Registriert: 4. Dezember 2009 20:50

Beitrag von ali-g »

ich verstehs immer noch nicht ganz


heißt das also ich muss direkt


void QAbstractItemView::mousePressEvent(QMouseEvent *event)
oder


void QWidget::mousePressEvent(QMouseEvent *event)

aufrufen ???


könntest du mir kurzes beispiel machen

sry wenn dich das jetzt aufregt oder so..
ali-g
Beiträge: 31
Registriert: 4. Dezember 2009 20:50

Beitrag von ali-g »

Sry für Doppelpost


meint ihr das so ???

Code: Alles auswählen

void  List::mousePressEvent(QMouseEvent *event)
{
    if(d->isActive)
    {
    QWidget::mousePressEvent(event);
    return;
    }



    const QEvent::Type eventType = event->type();
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);

switch(eventType)
{
case QEvent::MouseButtonPress:

        d->lastPressPoint = mouseEvent->pos();
         QMessageBox::about(this,"infO","Press");
         break;


default:
         QWidget::mousePressEvent(event);
         break;

}




Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag von Troll.Soft »

ali-g hat geschrieben: heißt das also ich muss direkt
void QAbstractItemView::mousePressEvent(QMouseEvent *event)
oder
void QWidget::mousePressEvent(QMouseEvent *event)
aufrufen ???
Ja
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wieso sollte man QWidget::eventFilter() aufrufen wenn doch von QListWidget abgeleitet wurde?? C++ Grundlagen wären nicht schlecht :(
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ali-g
Beiträge: 31
Registriert: 4. Dezember 2009 20:50

Beitrag von ali-g »

ich habs ja grad eben versucht....

ich habs auch mit direkt aufrufen versucht
keine Reaktion


@Christian81

ich hab ja nicht eventFilter gesagt
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

1. Wie hast Du es probiert - ohne Code können wir nur raten.
2. Glaube ich nicht - minimal kompilierbares Beispiel bitte ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ali-g
Beiträge: 31
Registriert: 4. Dezember 2009 20:50

Beitrag von ali-g »

Code: Alles auswählen

    void mousePressEvent(QMouseEvent *event)
    {
        //List::handlePressEvent(event);

        List ll;

        ll.handlePressEvent(event);



        if (event->button() == Qt::LeftButton)
        {
            //QMessageBox::about(this,"info","hhsd");
            QMessageBox box;
            box.setText("sjdiji");
            box.exec();




        }



            event->accept();


    }

dann hab ich das gleiche mit

void QAbstractItemView::mousePressEvent(QMouseEvent *event)

und

void QWidget::mousePressEvent(QMouseEvent *event)

versucht


dann in meiner eigenen implementierten Funktion:






Code: Alles auswählen

void  List::handlePressEvent(QMouseEvent *event)
{

    List::mousePressEvent(event);// erst mit dem versucht <-------------------------------------------------

        QWidget::mousePressEvent(event); // dann mit dem <-------------------------------------------------
        









    const QEvent::Type eventType = event->type();
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);

switch(eventType)
{
case QEvent::MouseButtonPress:

        d->lastPressPoint = mouseEvent->pos();
         QMessageBox::about(this,"infO","Press");
         break;


default:
        
         break;

}





}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Da ist sehr viel Chaos drin. Was führst du jetzt eine zusätzliche handlePresssEvent-Funktion ein? Und dein 1) sollte nicht kompilieren - mousePressEvent ist nicht statisch!!!

Und warum gehst du im mousePressEvent in einem switch über event->type, wenn doch wirklich klar ist, dass es ein MousePressEvent ist?
Und die Essenz hast du immer noch nicht verstanden:
Du erbst von QListWIdget, nicht von QWidget. Wenn du eine virtuelle Funktion implementierst aber weiterhin nicht auf die evtl. spezialisierte Funktionalität der Basisklasse verzichten willst, musst du die virtuelle Funktion selber aufrufen und zwar DIE IMPLEMENTIERNUG DER DIREKTEN BASISKLASSE!
QWidget ist NICHT die direkte Basisklasse von List sondern QListWIdget.

Deshalb muss der Aufruf in List::mousePressEvent so ausschauen:
QListWidget::mousePressEvent(event);

Verstanden?
ali-g
Beiträge: 31
Registriert: 4. Dezember 2009 20:50

Beitrag von ali-g »

Dankeschön ich habs verstanden, es funktioniert auch Danke.


wahrscheinlich regt ihr euch jetzt auf, aber ich hab noch ein klitze kleines problem mit:

Code: Alles auswählen

QObject::connect(&d->kineticTimer, SIGNAL(timeout()), SLOT(onKineticTimerElapsed()));
wenn ich versucht zu Kompilieren kommt rückgabewert: -1073741819 raus. Wenn ich es auskommentier kompiliert es wieder ganz normal.


Also ich hatte vor ein Paar Tagen ein gleiches Projekt gestartet nur mit
ScrollArea(das Thema ist KineticScrolling), nur bei ScrollArea ist dann die Basis klasse nicht QScrollArea sondern QMainWindow

und da funktioniert es wunderbar, auch mit dem Connect..
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Leg dir mal einen Compiler zu, der ordentliche Fehlermeldungen liefert und nicht nur einen Rückgabewert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Es gibt kein connect() mit 3 Parametern würde ich sagen.
http://doc.trolltech.com/4.7/qobject.html#connect
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten