Seite 1 von 1

QPushButton mit QWidget verbinden/steuern

Verfasst: 19. Januar 2006 17:14
von john_Ohlsen
Hallo und Servus,

ich möchte ein einfaches Pacman-Spiel programmieren.
Dazu möchte ich als Einstieg einen Vollkreis mit einem QPushButton
(rightMove) nach recht bewegen. Dieser Vollkreis steht in einen eigenen QWidget (playField).
In main() rufe ich

Code: Alles auswählen

connect(rightMove, SIGNAL(clicked()), playField, SLOT(movePacM(5)));
auf. Doch wenn ich einen Breakpoint in movePacM(...) setze, springt der Debugger nicht dort hinein.

Ich freue mich über Antworten.

Gruss

Thomas

Auszug main()

Code: Alles auswählen

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *quit = new QPushButton(tr("Quit"));
    quit->setFont(QFont("Times", 18, QFont::Bold));

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));

    PlayField *playField = new PlayField;

	QPushButton *rightMove = new QPushButton(tr("right move"));
	rightMove->setFont(QFont("Times", 16, QFont::Bold));

	connect(rightMove, SIGNAL(clicked()), playField, SLOT(movePacM(5)));
...
Auszug PlayField:

Code: Alles auswählen

void PlayField::movePacM(int moveUnit)
{
    if (moveUnit < 5)
        moveUnit = 5;
    if (moveUnit > 100)
        moveUnit = 100;
    currentPacMPosition += moveUnit;
    update();
}


void PlayField::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::blue);

	painter.save();
    painter.translate(currentPacMPosition, height()/2);
    painter.drawPie(QRect(0, -15, 15, 15), 0, 360 * 16);
    painter.restore(); 

}

Verfasst: 19. Januar 2006 21:44
von uhu01
Hy!

Das ist klar dass die Signals/Slots Verbindung nicht funktioniert, da du nur Signals/Slots verbinden kannst die eine gleiche Parametersignatur haben. Ausserdem kannst du keine Konstanten angeben. Die richtige Lösung wäre ein Slot für jede Richtung, wenn du direkt mit dem clicked() Signal arbeiten möchtest.

Als Tipp:
Programmierst du unter Linux, starte dein Programm aus einer Konsole, dann siehst du eine Fehlermeldung wenn du so einen Fehler machst.
Solltest du mit Windows programmieren füge folgendes ein:

Code: Alles auswählen

debug {
     CONFIG += console
}
Dann hast du zwar immer eine Konsole die sich öffnet, kannst aber gleich wie unter Linux solche Fehlermeldungen sehen, ausserdem gehen die qDebug() ausgaben dann nicht mehr ins leere.

mfg
uhu01

Verfasst: 20. Januar 2006 10:33
von john_Ohlsen
Hi,

ich habe eine Lösung gefunden.

Code: Alles auswählen

QPushButton *rightMove = new QPushButton(tr("&right move"));
rightMove->setFont(QFont("Times", 16, QFont::Bold));
connect(rightMove, SIGNAL(clicked()), playField, SLOT(movePacMRight()));

Code: Alles auswählen

void PlayField::movePacMRight(void)
{
    curPacMVPosi += 5;
    update();
}
Hier funktionert die Signal/Slot-Verbindung. Es ist aber auf der anderen Seite recht unflexibel. Für meine Zwecke reicht das fürs erste.

@uhu01: Wie schalte ich denn die Konsole unter VS 2003 .Net ein?

Verfasst: 20. Januar 2006 11:29
von uhu01
Hy!

Hatte ich doch geschrieben.

Code: Alles auswählen

debug {
      CONFIG += console
}
Ins pro File.

mfg
uhu0

Verfasst: 20. Januar 2006 11:46
von john_Ohlsen
Hi,

mit der .pro-Datei hast Du natürlich recht.
Im VS 2003 .NET kann man die Konsole nachträglich aktivieren:
Projek->Eigenschaften von <Projekt>->Linker->System->SubSystem-> Auswahl "Konsole (/SUBSYSTEM:CONSOLE)"

Viele Grüße

Thomas