Seite 1 von 1

signal-slot-verbindung funktioniert nicht

Verfasst: 27. Dezember 2009 14:55
von sudo rm -rf
Hallo,
ich bin gerade an meinem ersten größeren qt-projekt:
das strategiespiel risiko
das konsolenprogramm ist schon fertig
jetzt wollte ich es grafisch programmieren, da es in der konsole zwar spielbar ist, jedoch jeglichen spaß unnterbindet...

hier mein problem:

es sind drei klassen vorhanden: grafik, eingabe, risiko
alle drei klassen sind von QWidget abgeleitet.
in der main wird ein objekt spielfeld von grafik aufgerufen, spielfeld ruft ein objekt eingabefeld von eingabe auf und eingabefeld ruft ein objekt spiel von risiko auf.
eingabe hat einen button fertig, bei dessen SIGNAL(clicked()) der SLOT(slot_spielerwechsel()) aufgerufen werden soll, welcher in der klasse eingabe definiert ist.
in der main steht folgendes:

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

grafik *spielfeld = new grafik;


spielfeld->eingabefeld->start();
QObject::connect(spielfeld->eingabefeld->fertig, SIGNAL(clicked), spielfeld->eingabefeld, SLOT(slot_spielerwechsel()));
spielfeld->show();

return app.exec();
}

weshalb geschieht nichts, wenn ich auf den button fertig klicke?

compiler(gcc)-meldung(während der laufzeit):
Object::connect: Parentheses expected, signal QPushButton::clicked

Verfasst: 27. Dezember 2009 15:03
von franzf
SIGNAL(clicked) -> SIGNAL(clicked())
Parantheses == Klammern

Verfasst: 27. Dezember 2009 15:06
von sudo rm -rf
ok, mir ist mein fehler gerade beim lesen meines beitrags aufgefallen:
SIGNAL(clicked) falsch //meine eigene dummheit
SIGNAL(clicked()) richtig

ich habe aber noch eine grundlegende frage:
wie zeichne ich ein dreieck mit drawPolygone( const QPoint * points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill )?
ich versteh dazu die doku nicht.
ich habe drei punkte x1/y1, x2/y2 und x3/y3
soll ich die als argumente mit komma getrennt übergeben?

doch was ist dann das alles:
int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill

ich bin für jede hilfe dankbar!

Verfasst: 27. Dezember 2009 15:16
von franzf
Schau dir doch die Doku genauer an!
Da gibt es auch eine Funktion mit QPointF* genau darüber. Da steht ein dickes Beispiel dabei.
Und was die FillRule ist, steht auch in der Doku. Qt::FillRule ist sogar ein Link, den man anklicken kann.

Verfasst: 27. Dezember 2009 15:23
von sudo rm -rf
vielen dank!
hab ich nicht gesehen gehabt.
kann ich das auch ohne static const machen und somit points in einer schleife immer wieder neu zuweisen?

Verfasst: 27. Dezember 2009 15:26
von franzf
Probiers doch aus :P
Es gibt außerdem eine eigene QPolygon-Klasse. Kannst dir ja anschauen ob dir das was bringt.

Verfasst: 31. Dezember 2009 12:06
von sudo rm -rf
so, mein risiko läuft
nur noch eine frage:
weshalb funktioniert die auskommentierte zeile nicht?

Code: Alles auswählen

eingabefeld->einheiten->clear();
//eingabefeld->einheiten->insert(QString::number(eingabefeld->spiel->truppen[eingabefeld->feld_a->text().toInt() - 1][eingabefeld->spiel->spieler_am_zug]));
eingabefeld->activateWindow();
eingabefeld->einheiten->setFocus();
einheiten ist ein qlineedit feld
truppen ist ein int
feld_a ist ein lineedit feld
spieler_am_zug ist ein int

einheiten wird immer wieder auf "0" gesetzt, obwohl truppen[][] ungleich 0 ist.

Verfasst: 31. Dezember 2009 12:29
von franzf

Code: Alles auswählen

eingabefeld->einheiten->insert(QString::number(eingabefeld->spiel->truppen[eingabefeld->feld_a->text().toInt() - 1][eingabefeld->spiel->spieler_am_zug]));
Puh! So ne lange Zeile mit nur zwei Leerzeichen um das "-"...
Bitte berechne separat die biden Indize und hol dir mit denen dann den eigentlichen int aus dem Array. Jeweils ein kleines
qDebug() << "erster Index" << index1;
und du weißt was abgeht.

Wenn das Array eine Matrix ist (alle Zeilen sind gleich lang) und du das Array in der Klasse nie in der Größe veränderst, nimmst du vllt. besser eine QVector.
Auf die verschiedenen Zeilen der Matrix greifst du über einen Offset zu.

Code: Alles auswählen

const int rows = 10;
const int cols = 15;
QVector vec<int>( rows*cols );
int value = vec[3*cols + 5]; // Zeile 4, Spalte 6
Wenn du Bock hast kannst du dir auch (zum Übern) eine eigene kleine Klasse schreiben :D

Code: Alles auswählen

template <typename ValueT, const uint rows, const uint cols>
class Matrix
{
ValueT[rows*cols];
public:
    void setValue(uint row, uint col, const ValueT& val) throw (OutOfBound);
    const ValueT& value(uint row, uint col) const throw (OutOfBound);
};
als erster Ansatz. Aber nur wenn du öfters auch mit anderen Typen solche mehrdimensionalen Arrays brauchst (oder du mal templates anfassen willst).

Verfasst: 31. Dezember 2009 12:58
von sudo rm -rf
lol
es lag an meiner eigenen blödheit
ich muss spieler_am_zug - 1 schreiben

trotzdem danke für deine immer guten und superschnellen antworten
superschnell = unendlich * c