• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nauka Qt z pewnej książki ( pytanie o radę i problemy w kodzie )

Object Storage Arubacloud
0 głosów
573 wizyt
pytanie zadane 9 maja 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

Hej, zacząłem uczyć się Qt z tej książki: http://www.arxen.com/descargas/Books/Game%20Programming%20Using%20Qt%205,%20Begginer%27s%20Gu%20-%20Witold%20Wysota,%20Lorenz%20Haas.pdf

Utknąłem na stronie 38. Oto mój kod:

*.h

#ifndef TICTACTOEWIDGET_H
#define TICTACTOEWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QGridLayout>
class QPushButton;

class TicTacToeWidget : public QWidget {
    Q_OBJECT
public:
    TicTacToeWidget(QWidget *parent = nullptr);
    ~TicTacToeWidget();
private:
    QGridLayout *gridLayout;
    QList<QPushButton*> board;
    void setupBoard();
    void initNewGame();
};

#endif // TICTACTOEWIDGET_H

*.cpp

#include "tictactoewidget.h"
#include "ui_tictactoewidget.h"
#include <QPushButton>
#include <QGridLayout>
#include <QSignalMapper>

TicTacToeWidget::TicTacToeWidget(QWidget *parent)
    : QWidget(parent) {
    setupBoard();
    setLayout(gridLayout);
}

TicTacToeWidget::~TicTacToeWidget() {}

void TicTacToeWidget::setupBoard() {
    gridLayout = new QGridLayout(this);
    QSignalMapper* mapper = new QSignalMapper(this);
    for(int row = 0; row < 3; ++row) {
        for(int column = 0; column < 3; ++column) {
            QPushButton *button = new QPushButton;
            button->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
            button->setText(" ");
            gridLayout->addWidget(button, row, column);
            board.append(button);
            mapper->setMapping(button, board.count()-1);
            connect(button, SINGAL(clicked())), mapper, SLOT(map()));
        }
    }
}

void TicTacToeWidget::initNewGame() {
    for(int i=0; i<9; ++i) board.at(i)->setText(" ");
}

Problemy mam takie:

26: błąd: use of undeclared identifier 'clicked'

17: ostrzeżenie: 'QSignalMapper' is deprecated

Jak zobaczyłem że w książce w przykładach pokazane jest używanie nieaktualnych już klas to zacząłem się zastanawiać czy warto się z niej jeszcze uczyć, miał ktoś może jakiś kontakt z nią? Czy powinienem ją kontynuować? Druga sprawa dotyczy oczywiście funkcji clicked()...

Z góry dziękuje za pomoc w rozwiązaniu problemów i rady :)

2 odpowiedzi

+1 głos
odpowiedź 10 maja 2019 przez Bondrusiek Maniak (61,370 p.)
wybrane 10 maja 2019 przez Jakub 0
 
Najlepsza

Witam,

tak jak kolega powiedział prawdopodobnie błąd tkwi w literówce. Staraj się używać nowszej składni w przypadku pisania connect. W tym przypadku:

connect(button, &QPushButton::clicked, mapper, &QSignalMapper::map);

Tutaj więcej informacji : https://doc.qt.io/qt-5/signalsandslots.html. Co do QSignalMapper to ta klasa dalej jest aktualna. Książkę, którą teraz przerabiasz posiada 2 wydania, mimo wszystko nawet pierwsze wydanie jest dosyć nowe. Sam ją przerobiłem i wydaje mi się przyzwoita. Jeśli chcesz tworzyć gry z użyciem Qt polecam Ci zapoznać się z frameworkiem Qt czyli felgo: https://felgo.com/, który bazuje głownie na module QtQuick. Przykład użycia tego frameworka do stworzenie popularnej gry Flappy Bird https://felgo.com/doc/howto-flappybird-game/

1
komentarz 10 maja 2019 przez adrian17 Ekspert (344,860 p.)

Co do QSignalMapper to ta klasa dalej jest aktualna

Autorowi pytania pewnie chodziło o:

https://doc.qt.io/qt-5/qsignalmapper.html

This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.

komentarz 10 maja 2019 przez Bondrusiek Maniak (61,370 p.)
Ok, masz racje nie zauważyłem tego.
komentarz 10 maja 2019 przez Jakub 0 Pasjonat (23,120 p.)
Dziękuje, ogólnie tworzenie gier nie jest moim głównym celem, po prostu spodobała mi się na książka bo opisuje Qt od podstaw w praktyce na przykładach różnych projektów. A wydaje mi się że pisanie gier bardzo dobrze pozwala uczyć się języka programowania, algorytmiki, logicznego myślenia itd...

Mam tylko pytanie dotyczące klasy QSignalMapper, czy powinienem ją ostatecznie czymś zastąpić czy na razie nie muszę sobie zawracać tym głowy?
1
komentarz 10 maja 2019 przez Bondrusiek Maniak (61,370 p.)

@Jakub 0

nie zawracaj sobie tym głowy. Według źródła (2 edycji tej książki) można to tak zostawić.Według : https://github.com/PacktPublishing/Game-Programming-Using-Qt-5-Beginners-Guide-Second-Edition/blob/master/Chapter03/Qt%20GUI%20Programming/tictactoe/tictactoe%20ver7/tictactoewidget.cpp

...
TicTacToeWidget::TicTacToeWidget(QWidget *parent) : QWidget(parent)
{
    m_currentPlayer = Player::Invalid;
    QGridLayout *gridLayout = new QGridLayout(this);
    QSignalMapper *mapper = new QSignalMapper(this);
    for(int row = 0; row < 3; ++row) {
        for(int column = 0; column < 3; ++column) {
            QPushButton *button = new QPushButton(" ");
            button->setSizePolicy(QSizePolicy::Preferred,
                                  QSizePolicy::Preferred);
            gridLayout->addWidget(button, row, column);
            m_board.append(button);
            mapper->setMapping(button, m_board.count() - 1);
            connect(button, SIGNAL(clicked()), mapper, SLOT(map()));
        }
    }
    connect(mapper, SIGNAL(mapped(int)),
            this,   SLOT(handleButtonClick(int)));
}
...

Co do gier to możesz wejść na mojego GitHuba i zobaczyć przykładowe repozytoria gdzie wzorowałem się na tej książce. Może coś się przyda:

Założyłem nawet post na tym forum odnośnie powyższych repo: https://forum.pasja-informatyki.pl/344914/proste-gry-qt.

komentarz 16 maja 2019 przez Jakub 0 Pasjonat (23,120 p.)

Hej, wiem że teraz robię bardzo źle ale mam kolejny drobny problem i nie widzę sensu koniecznie zakładać dla niego pytania. Więc wyjątkowo zadam jeszcze jedno pytanie pod tym tematem ( już więcej razy nie będę ). Mam nadzieje że mi to wybaczysz ;)

Kwestia dotyczy strony 55, a dokładnie tej funkcji:
 


void ConfigurationDialog::updateOKButtonState() {
    bool pl1NameEmpty = ui->player1Name->text().isEmpty();
    bool pl2NameEmpty = ui->player2Name->text().isEmpty();
    QPushButton* okButton = ui->buttonBox->button(QDialogButtonBox::Ok);
    okButton->setDisabled(pl1NameEmpty || pl2NameEmpty); 
}

Mam takie błędy:

configurationdialog.cpp:21: błąd: member access into incomplete type 'QPushButton'

qdialog.h:51: forward declaration of 'QPushButton'

Raczej nie jest to literówka bo mogę skopiować to z książki i nadal jest tak samo... będę bardzo wdzięczny za pomoc i pozdrawiam :)

 

1
komentarz 16 maja 2019 przez adrian17 Ekspert (344,860 p.)
Mógłbym prosić o cały kod?
komentarz 16 maja 2019 przez Jakub 0 Pasjonat (23,120 p.)
Problem rozwiązany, nie dodałem odpowiedniego pliku nagłówkowego...
+1 głos
odpowiedź 9 maja 2019 przez adrian17 Ekspert (344,860 p.)

SINGAL

SIGNAL?

komentarz 10 maja 2019 przez Jakub 0 Pasjonat (23,120 p.)
Dziękuje, faktycznie :)

Podobne pytania

0 głosów
2 odpowiedzi 2,056 wizyt
pytanie zadane 6 maja 2016 w Offtop przez Szymon234 Początkujący (340 p.)
0 głosów
4 odpowiedzi 764 wizyt
+1 głos
3 odpowiedzi 576 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...