QListWidget und das QMouseEvent

Alles rund um die Programmierung mit Qt
Antworten
the_immortal
Beiträge: 39
Registriert: 31. Mai 2006 21:21
Wohnort: CH

QListWidget und das QMouseEvent

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

du rufst in deiner mousePressEvent(QMouseEvent *event) - Methode

Code: Alles auswählen

QListWidget:mousePressEvent(event)
auf
the_immortal
Beiträge: 39
Registriert: 31. Mai 2006 21:21
Wohnort: CH

Beitrag 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: !
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das wage ich zu bezweifeln. Poste doch mal den Code deiner Funktion hier...
the_immortal
Beiträge: 39
Registriert: 31. Mai 2006 21:21
Wohnort: CH

Beitrag 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);
    
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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);
 } 
the_immortal
Beiträge: 39
Registriert: 31. Mai 2006 21:21
Wohnort: CH

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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?
the_immortal
Beiträge: 39
Registriert: 31. Mai 2006 21:21
Wohnort: CH

Beitrag 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
Antworten