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

Verschiedenes zu Qt
Antworten
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

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

Beitrag 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..
Zuletzt geändert von insertcoin am 14. Mai 2009 16:08, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ein Widget ist immer an Position 0,0. Du must deine Koordinaten umrechnen lassen...
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Beitrag 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 ..
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

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

Beitrag 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...
insertcoin
Beiträge: 54
Registriert: 19. Mai 2008 13:08

Beitrag von insertcoin »

ok, da wird die childrenRect() dann auch überflüssig.

danke für deine Hilfe!!
Antworten