QPushButton mit QWidget verbinden/steuern

Alles rund um die Programmierung mit Qt
Antworten
john_Ohlsen
Beiträge: 13
Registriert: 19. Januar 2006 16:57
Wohnort: München

QPushButton mit QWidget verbinden/steuern

Beitrag 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(); 

}
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag 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
john_Ohlsen
Beiträge: 13
Registriert: 19. Januar 2006 16:57
Wohnort: München

Beitrag 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?
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!

Hatte ich doch geschrieben.

Code: Alles auswählen

debug {
      CONFIG += console
}
Ins pro File.

mfg
uhu0
john_Ohlsen
Beiträge: 13
Registriert: 19. Januar 2006 16:57
Wohnort: München

Beitrag 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
Antworten