Seite 1 von 1

QListWidget und das QMouseEvent

Verfasst: 9. Juni 2006 18:31
von the_immortal
Ich überschreibe die Methode:

Code: Alles auswählen

mousePressEvent(QMouseEvent *event)
in meinem QListWidget um ein QDrag Objekt zu erstellen. Nun habe ich das Problem dass die QListWidgetItems nicht mehr markiert/selektiert werden.

Nun gibt es 2 Fragen:
- Ist es korrekt, dass die mousePressEvent Methode überschrieben wurde, resp. dass das Selektieren warscheinlich zuvor über diese Methode lief?
- Wie kann ich machen, dass die Items selektiert werden?

Verfasst: 10. Juni 2006 09:32
von upsala
du rufst in deiner mousePressEvent(QMouseEvent *event) - Methode

Code: Alles auswählen

QListWidget:mousePressEvent(event)
auf

Verfasst: 10. Juni 2006 10:45
von the_immortal
upsala hat geschrieben:du rufst in deiner mousePressEvent(QMouseEvent *event) - Methode

Code: Alles auswählen

QListWidget:mousePressEvent(event)
auf
hmm ... das kann doch nicht gehen, dass würde ja ein Loop erzeugen. Nun ja ich habs probiert und es gibt wie erwartet ein Loop :roll: !

Verfasst: 10. Juni 2006 12:48
von upsala
Das wage ich zu bezweifeln. Poste doch mal den Code deiner Funktion hier...

Verfasst: 10. Juni 2006 13:18
von the_immortal
upsala hat geschrieben:Das wage ich zu bezweifeln. Poste doch mal den Code deiner Funktion hier...

Code: Alles auswählen

#include <QtGui>
#include "PatternList.h"

PatternList::PatternList(QWidget *parent) : QListWidget(parent)
{
    setAcceptDrops(true); // enable drop events

    new QListWidgetItem(tr("bass simple"), this);
    new QListWidgetItem(tr("bass fill in"), this);
    new QListWidgetItem(tr("drum1"), this);
    new QListWidgetItem(tr("drum2"), this);
    new QListWidgetItem(tr("drum3"), this);
    new QListWidgetItem(tr("drum fill in 1"), this);

}

void PatternList::dragEnterEvent(QDragEnterEvent *event) // event which is sent to a widget when a drag and drop action enters it
{
    if (event->mimeData()->hasFormat("application/x-dnditemdata"))
    {
        if (event->source() == this)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        else
        {
            event->acceptProposedAction();
        }
    }
    else
    {
        event->ignore();
    }
}

void PatternList::mousePressEvent(QMouseEvent *event)
{
    int cRow = currentRow();
    
    QByteArray itemData;
    QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    dataStream << cRow; // write cRow to datastream

    QPixmap *pixmap = new QPixmap(50, 30); // create picture diplayed during drag
    QPainter painter;
    painter.begin(pixmap);
    painter.fillRect(QRectF(0, 0, 50, 30), QBrush(QColor(Qt::black), Qt::SolidPattern));
    painter.end();

    QMimeData *mimeData = new QMimeData;
    mimeData->setData("application/x-dnditemdata", itemData); // set mime data
    
    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);
    drag->setPixmap(*pixmap);
    drag->start(Qt::CopyAction | Qt::MoveAction);
    
}

Verfasst: 10. Juni 2006 13:43
von upsala

Code: Alles auswählen

void PatternList::mousePressEvent(QMouseEvent *event) 
 { 
     int cRow = currentRow(); 
     
     QByteArray itemData; 
     QDataStream dataStream(&itemData, QIODevice::WriteOnly); 
     dataStream << cRow; // write cRow to datastream 
 
     QPixmap *pixmap = new QPixmap(50, 30); // create picture diplayed during drag 
     QPainter painter; 
     painter.begin(pixmap); 
     painter.fillRect(QRectF(0, 0, 50, 30), QBrush(QColor(Qt::black), Qt::SolidPattern)); 
     painter.end(); 
 
     QMimeData *mimeData = new QMimeData; 
     mimeData->setData("application/x-dnditemdata", itemData); // set mime data 
     
     QDrag *drag = new QDrag(this); 
     drag->setMimeData(mimeData); 
     drag->setPixmap(*pixmap); 
     drag->start(Qt::CopyAction | Qt::MoveAction); 

     QListWidget::mousePressEvent(event);
 } 

Verfasst: 10. Juni 2006 14:53
von the_immortal
Wenn ich das richtig verstehe rufst du einfach zusätzlich die mousePressEvent() Methode auf. Und dann hast du ein Loop oder irre ich mich da?

Ich kann nichts mehr eingeben und nach ein paar Sekunden beendet das Programm; lässt vermuten, dass ein Loop vorhanden sein könnte.

Verfasst: 10. Juni 2006 15:22
von upsala
Ja, aber ich ruf mousePressEvent vom QListWidget auf und nicht vom PatternList und somit dürfte es kein Loop geben. Hast du dir das ganze schon mal im Debugger angeschaut?

Verfasst: 10. Juni 2006 17:35
von the_immortal
upsala hat geschrieben:Ja, aber ich ruf mousePressEvent vom QListWidget auf und nicht vom PatternList und somit dürfte es kein Loop geben. Hast du dir das ganze schon mal im Debugger angeschaut?
jetzt scheint es tatsächlich zu funktionieren :P