Seite 1 von 2

QListWidget Event Problem

Verfasst: 6. März 2011 16:11
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);



}   
       

Verfasst: 6. März 2011 16:39
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.

Verfasst: 6. März 2011 16:46
von ali-g
sorry, ich verstehs nicht ganz :oops:

Verfasst: 6. März 2011 17:08
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.

Verfasst: 6. März 2011 18:03
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..

Verfasst: 6. März 2011 19:03
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;

}





Verfasst: 6. März 2011 19:03
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

Verfasst: 6. März 2011 19:12
von Christian81
Wieso sollte man QWidget::eventFilter() aufrufen wenn doch von QListWidget abgeleitet wurde?? C++ Grundlagen wären nicht schlecht :(

Verfasst: 6. März 2011 19:17
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

Verfasst: 6. März 2011 19:24
von Christian81
1. Wie hast Du es probiert - ohne Code können wir nur raten.
2. Glaube ich nicht - minimal kompilierbares Beispiel bitte ...

Verfasst: 6. März 2011 20:20
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;

}





}

Verfasst: 6. März 2011 20:38
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?

Verfasst: 8. März 2011 21:01
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..

Verfasst: 8. März 2011 21:36
von upsala
Leg dir mal einen Compiler zu, der ordentliche Fehlermeldungen liefert und nicht nur einen Rückgabewert.

Verfasst: 9. März 2011 06:34
von Christian81
Es gibt kein connect() mit 3 Parametern würde ich sagen.
http://doc.trolltech.com/4.7/qobject.html#connect