mousePressEvent() überladen
-
- Beiträge: 4
- Registriert: 7. Juli 2011 17:50
mousePressEvent() überladen
Hallo,
ich brauche mal Hilfe bei einem Problem mit Buttons.
Das centralwidget ist genauso groß ist wie ein erzeugtes Objekt. In dies Objekt werden QLabels per Drag and Drop verschoben. Die Funktion mousePressEvent wurde mit dem Drag and Drop überladen.Nun erkennt aber die Funktion keine Buttons mehr, welche gedrückt werden müssen.
Ich bräuchte etwas Rat wie ich es Schaffe ohne das Objekt zu verkleinern (was nämlich wegen drag and drop Gründen nicht geht) die Buttons klickbar zu machen.
Wäre für einen Rat sehr dankbar
ich brauche mal Hilfe bei einem Problem mit Buttons.
Das centralwidget ist genauso groß ist wie ein erzeugtes Objekt. In dies Objekt werden QLabels per Drag and Drop verschoben. Die Funktion mousePressEvent wurde mit dem Drag and Drop überladen.Nun erkennt aber die Funktion keine Buttons mehr, welche gedrückt werden müssen.
Ich bräuchte etwas Rat wie ich es Schaffe ohne das Objekt zu verkleinern (was nämlich wegen drag and drop Gründen nicht geht) die Buttons klickbar zu machen.
Wäre für einen Rat sehr dankbar
Ich hab den Zweitpost mal gelöscht
Das Problem lässt sich leicht lösen:
In deiner eigenen Implementierung musst du das mousePressEvent() der Basisklasse aufrufen. Wie man das anstellt sollte dein C++-Grundlagenbuch erklären. In den Qt-Examples stolpert man auch oft genug darüber. (Soll jetzt keine Ratestunde werden, sondern einfach der Anreiz, ein recht einfaches Problem selber zu lösen).
Wenn das in deinem Buch nicht drin steht, ist es das die Zeit nicht wert, die du darin liest.
Das Problem lässt sich leicht lösen:
In deiner eigenen Implementierung musst du das mousePressEvent() der Basisklasse aufrufen. Wie man das anstellt sollte dein C++-Grundlagenbuch erklären. In den Qt-Examples stolpert man auch oft genug darüber. (Soll jetzt keine Ratestunde werden, sondern einfach der Anreiz, ein recht einfaches Problem selber zu lösen).
Wenn das in deinem Buch nicht drin steht, ist es das die Zeit nicht wert, die du darin liest.
-
- Beiträge: 4
- Registriert: 7. Juli 2011 17:50
irgendwie hab ich das gemacht...oder es war falsch
QWidget::mousePressEvent(event);
hab ich in die funktion mousPressEvent() geschrieben.
kann es sein dass es an der falschen Stelle steht, das Programm stürzt mir ab!
// edit franzf:
CODE-Tags engefügt - bitte in Zukunft selber, danke
QWidget::mousePressEvent(event);
hab ich in die funktion mousPressEvent() geschrieben.
kann es sein dass es an der falschen Stelle steht, das Programm stürzt mir ab!
Code: Alles auswählen
void DragAndDrop::mousePressEvent(QMouseEvent *event){
qDebug()<<"mousePressEvent()";
//Erstellen von einem Child vom Stein
child = static_cast<QLabel*>(childAt(event->pos()));
int x1=(event->x()-35)/76;
int y1;
int feld_nr;
if(event->y()<310){
y1=(event->y()-56)/76;
feld_nr= x1+(y1*8);
}else{
y1=(event->y()-310)/76;
feld_nr= x1+(y1*6);
}
if (!child || child->pixmap()==0){
qDebug()<<"return";
QWidget::mousePressEvent(event);
}
QPixmap pixmap = *child->pixmap();
//qDebug() << pixmap.width() << " x " << pixmap.height();
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << pixmap << QPoint(event->pos() - child->pos())<<feld_nr;
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-qt-image",itemData);
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos() - child->pos());
QPixmap tempPixmap = pixmap;
QPainter painter;
painter.begin(&tempPixmap);
painter.fillRect(pixmap.rect(), QColor(180, 200, 255, 192));//füllt Rechteck mit graublau
painter.end();
child->setPixmap(tempPixmap);
if (!(drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction)){
child->show();
child->setPixmap(pixmap);
}
}
CODE-Tags engefügt - bitte in Zukunft selber, danke
Denk nach über diese Zeile:
Außerdem:
* findest du einen besseren cast als static_cast an dieser Stelle?
* Warum immer new? Verwende doch automatische Objekte (="Stack")
Code: Alles auswählen
if (!child || child->pixmap()==0)
* findest du einen besseren cast als static_cast an dieser Stelle?
* Warum immer new? Verwende doch automatische Objekte (="Stack")
-
- Beiträge: 4
- Registriert: 7. Juli 2011 17:50
aber wie hilft mir das weiter bei meinem Problem?
gut das mit dem !child kann raus...aber der Rest, hat der Auswirkungen darauf, dass mein Überladen nicht funktioniert?
entferne ich aus der Abrage
eine Bedingung stürzt das Programm ebenfalls ab, jedoch erst wenn ich im Programm mit der Maus klicke
gut das mit dem !child kann raus...aber der Rest, hat der Auswirkungen darauf, dass mein Überladen nicht funktioniert?
entferne ich aus der Abrage
Code: Alles auswählen
if(!child || child->pixmap()==0)
eine Bedingung stürzt das Programm ebenfalls ab, jedoch erst wenn ich im Programm mit der Maus klicke
-
- Beiträge: 200
- Registriert: 9. Juli 2010 19:31
Problem: Die Abfrage "!child" setzt voraus, dass tatsächlich child NULL ist, auch wenn ein Widget darunter ist. childAt() liefert ja erstmal nur ein QWidget zurück, da hast du gut erkannt "ich will aber nur QLabels" - deshalb castest du. Nur - static_cast ist der falsche cast! Du willst einen dynamic_cast, der liefert tatsächlich NULL, wenn der cast nicht funktioniert (bei Zeigern - dynamic_cast mit Referenzen wirft eine Exception). Es gibt von Qt eine speziell auf QObject-Ableitungen optimierte Version, qobject_cast.deliaophelia hat geschrieben:entferne ich aus der Abrage
Code: Alles auswählen
if(!child || child->pixmap()==0)
eine Bedingung stürzt das Programm ebenfalls ab, jedoch erst wenn ich im Programm mit der Maus klicke
Soll heißen: Das static_cast liefert dir irgendwas zurück, egal ob richtig oder nicht - nicht verlässlich!
Desweiteren denke ich, du wolltest tatsächlich fragen:
Code: Alles auswählen
if (child && !child->pixmap())
Desweiteren: in dem if-Zweig schreibst du "return" auf die Konsole, verlässt aber die Funktion nicht. Danach greifst du munter auf child->pixmap() zu, ohne dich vorher abzusichern!