Seite 1 von 1

QRect::contains(QPoint) funktioniert nicht richtig [SOLVED]

Verfasst: 14. Mai 2009 00:54
von insertcoin
Hey ho,

ich kapier wieder einmal nicht was vor sich geht, und bräuchte eure Hilfe. Ich möchte eine Art MEmory programmieren, bin jedoch ganz am Anfang und spiele noch ein bisschen rum. Die Karten sind einzelne Widgets und sollen mit einem Mausklick selektiert werden, dazu habe ich einen MouseEvent eingebaut in dem ich die Pos der Maus abfrage. Zum Test habe ich den QPOint den ich für den Mausklick bekomme mit contains(QPoint) auf das QRect irgendeiner Karte(einzelnes Widget) im SPielfeld abgefragt und eine andere gelöscht um zu sehen ob es funktioniert.
Problem ist, egal in welchem QRect von welcher Karte ich den QPoint abfrage, gelöscht wird immer wenn ich auf die erste im Bild klicke.

Das ganze ist schwer zu erklären, hab das Programm beigelegt und die markanten Stellen markiert..

Code: Alles auswählen

#ifndef PAIRS_H
#define PAIRS_H

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

class Pairs :  public QWidget
{
public:

    // Methods

    Pairs();
    QVector<PairsCard*> pairsCards;
    void mousePressEvent(QMouseEvent *);
    bool findSelectedPairCard(QPoint);
};

#endif // PAIRS_H

-------------------------------------------------------------------------------------

#include "pairs.h"

Pairs::Pairs()
{


  QGridLayout *layout=new QGridLayout;

   for (int x=0; x<60; x++)
       pairsCards.push_back(new PairsCard());

    // place pairCards in the pairsWidget
    int i=0;
    for (int x=0; x<6; x++)
           for (int y=0; y<10; y++)
        {
                layout->addWidget(pairsCards.at(i), x, y);
                i++;
         }

    this->setLayout(layout);
}

void Pairs::mousePressEvent(QMouseEvent *event)
{

    QPoint point = event->pos();
    if (findSelectedPairCard(point))
        delete pairsCards.at(10); // Hier wird irgendeine Karte im BIld gelöscht wenn der geklickte Punkt im agefragten Bereich (unten) liegt**************************************************
}

bool Pairs:: findSelectedPairCard(QPoint point)
{
    if (pairsCards.at(5)->rect().contains(point, false)) // HIer ist die Abfrage ob der Punkt im Rechteck enthalten ist******************************************************
              return true;

    return false; // no pairsCard was selected
}

-------------------------------------------------------------------------------------

#ifndef PAIRSCARD_H
#define PAIRSCARD_H

#include <QtGui>

class PairsCard : public QWidget
{
        Q_OBJECT

public:
    PairsCard();
    ~PairsCard();
    void paintEvent(QPaintEvent *);


    // Attributes

    QString *text;
    QColor *backgroundColor;
};

#endif // PAIRSCARD_H

-------------------------------------------------------------------------------------

#include "pairscard.h"

PairsCard::PairsCard()
{
}

PairsCard::~PairsCard()
{

}

void PairsCard::paintEvent(QPaintEvent *)
 {
     QPainter painter(this);
     painter.setPen(QPen(Qt::black, 5 ));
     painter.setFont(QFont("Arial", 15));
     painter.drawText(rect(), Qt::AlignCenter, "Qt");

    int side = qMin(width(), height()); // find shorter side of widget
    painter.setViewport((width() - side) / 2, (height() - side) / 2, side, side);
    painter.drawRect ( 5, 5, width()-10, height()-10 );
 }

-------------------------------------------------------------------------------------

#include <QtGui/QApplication>
#include "pairscard.h"
#include "pairs.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    Pairs pairs;

    pairs.show();



    return app.exec();
}

ISt bestimmt ein simpler Fehler, aber der nimmt mir grad schon wieder total die Lust zum weitermachen. Ich hoffe mir kann jemand einen Tipp geben .. vielen DAnk schonmal dafür..

Verfasst: 14. Mai 2009 07:22
von upsala
Ein Widget ist immer an Position 0,0. Du must deine Koordinaten umrechnen lassen...

Verfasst: 14. Mai 2009 12:05
von insertcoin
ok, heißt die einzelnen widgets relativ zum hauptwidget verrechnen, oder? das hilft mir auf jeden fall weiter, jetzt weiß ich wo das problem liegt und kann nach einer lösung suchen. danke ..

Verfasst: 14. Mai 2009 12:59
von insertcoin
hab das problem nun mit der QWidget::childAt(const QPoint &p) Methode gelöst. Mir ist aber noch nicht klar wie ich die Koordinaten bestimmter childWidgets bekomm. Da wäre noch die Funktion
QRect QWidget::childrenRect()
aber bei der kann ich ja nicht angeben welches child ich möchte.

Verfasst: 14. Mai 2009 15:14
von upsala
QPoint mapFrom ( QWidget * parent, const QPoint & pos ) const
QPoint mapFromGlobal ( const QPoint & pos ) const
QPoint mapFromParent ( const QPoint & pos ) const
QPoint mapTo ( QWidget * parent, const QPoint & pos ) const
QPoint mapToGlobal ( const QPoint & pos ) const
QPoint mapToParent ( const QPoint & pos ) const

childrenRect() ist sicher nicht das was du suchst...

Verfasst: 14. Mai 2009 16:08
von insertcoin
ok, da wird die childrenRect() dann auch überflüssig.

danke für deine Hilfe!!