Seite 1 von 1
QListWidget und das QMouseEvent
Verfasst: 9. Juni 2006 18:31
von the_immortal
Ich überschreibe die Methode:
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
auf
Verfasst: 10. Juni 2006 10:45
von the_immortal
upsala hat geschrieben:du rufst in deiner mousePressEvent(QMouseEvent *event) - Methode
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

!
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
