Qt GUI wyswietlanie

0

Jak mowilem na pewno problemy wystapia i juz mam jeden ;). Chce sobie stworzyc etykiety ktore beda aktualizowane co ruch gracza i wyswietlane. Samo to wiem jak zrobic, jednak po podlaczeniu do slota funkcji wyswietlajacej nie rysuje ona nic.

mainwindow.h

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QApplication>
#include <QMainwindow>
#include <QTextCodec>
#include <QPushButton>
#include <QLabel>
#include <QMenuBar>
#include <QStatusBar>
#include <QGridLayout>
#include "gra.h"

class MainWindow : public QMainWindow
{
   Q_OBJECT

private:
   QPushButton *ruch,*kup,*sprzedaj;

   QLabel *poleGry;
   QLabel *pionek0,*pionek1,*pionek2,*pionek3;
   vector<QLabel*>konta;

   QMenu *menu;
   QMenu *setPlayer;

   QAction *player2;
   QAction *player3;
   QAction *player4;
   QAction *quitAction;

   gra *plansza;

   void createMenus();
   void movePlayer(int nr, int poz);
   void moveP2(int nr, int cel);

   int g0,g1,g2,g3; //tymczasowe pol graczy
   int ktory; //zapamietujemy czyja kolej
   int ile_graczy; //do wczytania

public:
   MainWindow();
private slots:
   void SetPlayerCount(short int number);
   void foo();
};

#endif // MAINWINDOW_HPP

mainwindow.cpp

#include "mainwindow.h"

int tabx[40]={487,416,377,338,299,260,223,184,145,106,34,34,34,34,34,34,34,34,34,34,34,106,145,184,223,260,299,338,377,416,487,487,487,487,487,487,487,487,487,487};
int taby[40]={547,547,547,547,547,547,547,547,547,547,547,476,437,398,360,321,282,244,205,166,93,93,93,93,93,93,93,93,93,93,93,166,205,244,282,321,360,398,437,476};

MainWindow::MainWindow()
{
   createMenus();
   setMinimumSize(520,580);
   setMaximumSize(520,580);

   ruch = new QPushButton(tr("&Ruch"),this);
   ruch->setGeometry(10,30,100,30);
   ruch->connect(ruch,SIGNAL(clicked()),this,SLOT(foo()));

   kup = new QPushButton(tr("&Kup"),this);
   kup->setGeometry(120,30,100,30);
   kup->hide(); //jak nizej

   sprzedaj = new QPushButton(tr("&Sprzedaj"),this);
   sprzedaj->setGeometry(230,30,100,30);
   sprzedaj->hide(); //pokazuje sie tylko gdy mozliwy zakup

   QPixmap pixmap1("F:\\Dropbox\\FlorasShared\\eurobiznes\\obrazki\\plansza.png");
   poleGry = new QLabel(0,this);
   poleGry->setGeometry(10,70,500,500);
   poleGry->setPixmap(pixmap1.scaled(500,500));

   pionek0 = new QLabel(0,this);
   pionek0->setGeometry(487,547,15,15);
   QPixmap pionekpix0("F:\\Dropbox\\FlorasShared\\eurobiznes\\obrazki\\czerwony.png");
   pionek0->setPixmap(pionekpix0.scaled(15,15));

   pionek1 = new QLabel(0,this);
   pionek1->setGeometry(487,530,15,15);
   QPixmap pionekpix1("F:\\Dropbox\\FlorasShared\\eurobiznes\\obrazki\\niebieski.png");
   pionek1->setPixmap(pionekpix1.scaled(15,15));

   pionek2 = new QLabel(0,this);
   pionek2->setGeometry(470,547,15,15);
   QPixmap pionekpix2("F:\\Dropbox\\FlorasShared\\eurobiznes\\obrazki\\zielony.png");
   pionek2->setPixmap(pionekpix2.scaled(15,15));

   pionek3 = new QLabel(0,this);
   pionek3->setGeometry(470,530,15,15);
   QPixmap pionekpix3("F:\\Dropbox\\FlorasShared\\eurobiznes\\obrazki\\rozowy.png");
   pionek3->setPixmap(pionekpix3.scaled(15,15));

   g1=g0=g2=g3=0;
   ktory=0;

}

void MainWindow::foo()
{
    int los=rand()%6+1;
    movePlayer(ktory,los);
    ktory++;
    if(ktory==4)ktory=0;
}

void MainWindow::createMenus()
{
   menu = menuBar()->addMenu(tr("&Menu"));
   setPlayer = menu->addMenu(tr("&Ilosc graczy"));

   player2 = new QAction(tr("&2 Graczy"),this);
   player3 = new QAction(tr("&3 Graczy"),this);
   player4 = new QAction(tr("&4 Graczy"),this);

   quitAction = new QAction(tr("&Wyjscie"), this);
   quitAction->setStatusTip(tr("Wyjdz z programu"));
   connect (quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));

   setPlayer->addAction(player2);
   connect (player2, SIGNAL(triggered()), this, SLOT(SetPlayerCount(2)));

   setPlayer->addAction(player3);


   setPlayer->addAction(player4);


   menu->addAction(quitAction);
}

void MainWindow::SetPlayerCount(short int number)
{
    int x=0;
    switch(number)
    {
    case 2:
        konta.resize(2);
        plansza = new gra(2);
        for(int i=0;i<2;i++)
        {
            konta[i]->setText("aaaaaaaaaaaa");
            konta[i]->setGeometry(x+15,15,100,30);
        x+=50;
        }
    }
}

Chcialem polaczyc w menu przycisk 2 graczy z funkcja setplayercount ktora ustawi ilosc graczy i narysuje odpowiednie etykiety. Jednak nic nie rysuje. na razie tylko dla 2, bo nie dziala i tak.

0

Okej, a gdzie w ogóle te Labele 'przydzielasz''?

0

QWidget::update() obacz sobie.

0
Blood napisał(a)

Okej, a gdzie w ogóle te Labele 'przydzielasz''?

vector<QLabel*>konta;

mam w pliku naglowkowym potem w .cpp mam funkcje createmenus ktora mi tworzy w menu odnosnik do ustawienia 2 graczy i po kliknieciu ta wywoluje funkcje ze slotu SetPlayerCount i tam jest

void MainWindow::SetPlayerCount(short int number)   //po zmianie ilosci graczy rozpoczynac gre od nowa z nowa lista graczy
{                                                   //wczytywac imiona graczy (niekoniecznie)
    switch(number)
    {
    case 2:
        konta.resize(2); //ustawiam wielkosc na ilosc graczy
        plansza = new gra(2); //gra to moja klasa tworze odpowiednia gre dla 2 graczy
        for(int i=0;i<2;i++)
        {
            konta[i] = new QLabel(0,this); // tworze nowa etykiete
            konta[i]->setText("aaaaaaaaaaaaaaaaaaaaa"); // przypisuje jej tekst
            konta[i]->setGeometry(15,15,100,30); // ustawiam gdzie wyswietlic
        }
    }
}

Jednak sie nie rysuje po kliknieciu w 2 graczy w menu. Nie bardzo wiem jak korzystac z qwidget. na razie najprostsze pare rzeczy ogarnalem. Jak wlasnie wstawic w qlabel background jakis czy jakie etykiety dodac.

Tutaj tworze

  player2 = new QAction(tr("&2 Graczy"),this); //tworze przyciski
   player3 = new QAction(tr("&3 Graczy"),this);
   player4 = new QAction(tr("&4 Graczy"),this);

   quitAction = new QAction(tr("&Wyjscie"), this);
   quitAction->setStatusTip(tr("Wyjdz z programu"));
   connect (quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));

   setPlayer->addAction(player2); //dodaje
   connect (player2, SIGNAL(triggered()), this, SLOT(SetPlayerCount(2))); //lacze
   setPlayer->addAction(player3);
   connect (player3, SIGNAL(triggered()), this, SLOT(SetPlayerCount(3)));
   setPlayer->addAction(player4);
   connect (player4, SIGNAL(triggered()), this, SLOT(SetPlayerCount(4)));

Ten qtwidget::update() za duzo mi nie da. Pisze ze on "odswieza" widok, rysuje ponownie to co jest typu qwidget. Ja uzywam qlabel, bo w qwidget nie widzialem opcji setPixmap. Moze nie wiem jak uzyc, bo dopiero zaczynam zabawe z qt gui.

0

Okej, fajnie, że labelowi przypisujesz text, ale nie przypisujesz tych labeli do żadnego widgeta. O to mi chodziło! W momencie gdy przypiszesz QLabel do jakiegoś QWidget to funkcja QWidget::update() powinna działać.

Cały widok okna programu jest ustawiany razem z wywołaniem konstruktora MainWindow. Potem, żeby coś dorysować w takim przypadku jaki jest u Ciebie, trzeba ten widok odświeżyć, właśnie funkcją wspomnianą przez MasterBLB

0

Teraz zauwazylem ze wyswietla sie takie cos w komuniktach

Object: No such slot MainWindow::SetPlayerCount(4)

Wynika z tego ze moja funkcja nie jest polaczona z przyciskiem ustawiania graczy. Podkresla mi connect na czerwono, ale sie kompiluje o co chodzi?

Ta funkcje qwidget nawet jesli wywolalem na koncu ten funkcji rysujacej mojej to i tak nic sie nie dzieje przy wywolaniu. Moze dlatego ze nie mam zadnego elementu klasy qwidget, jedynie qlabel? Jak to w takim razie przypisac do okna glownego aplikacji? jest cos zle?
myslalem ze tutaj konta[i]=new QLabel(0,this) przypisuje wlasnie do mojego glownego okna to.

0

Przypisywać qlabele do widgeta to akurat przypisuje poprzez wywołania (zbyteczne o 1szy argument btw):

new QLabel(0,this)

w konstruktorze MainWindowa

0

Wiec teoretycznie jesli te etykiety moje sa czescia mojego okna, to po narysowaniu ta moja funkcja setplayercount odpowiednich labeli, a nastepnie wykonaniu funkcji qwidget::update() powinny sie one pojawic w oknie. Kiedy wrzucilem ta funkcje na koniec funkcji setplayercount i podpialem ja pod przycisk ruchu. Po kliknieciu nic sie nie pokazalo.

Z twojego posta wynika ze okno mainwindow jest jakby typu qwidget. Jesli chce cos dorysowac/dorzucic do okna ale juz po utworzeniu okna przez konstruktor to czy jest to mozliwe? Jesli tak, to prosze o cos konkretniejszego, bo mi za nic sie nie chce to wyrysowac.

0
Krycho napisał(a)

Wiec teoretycznie jesli te etykiety moje sa czescia mojego okna, to po narysowaniu ta moja funkcja setplayercount odpowiednich labeli, a nastepnie wykonaniu funkcji qwidget::update() powinny sie one pojawic w oknie. Kiedy wrzucilem ta funkcje na koniec funkcji setplayercount i podpialem ja pod przycisk ruchu. Po kliknieciu nic sie nie pokazalo.

Pokaż kod,w którym skiepściłeś wywołanie tej prostej funkcji.

Krycho napisał(a)

Z twojego posta wynika ze okno mainwindow jest jakby typu qwidget. Jesli chce cos dorysowac/dorzucic do okna ale juz po utworzeniu okna przez konstruktor to czy jest to mozliwe? Jesli tak, to prosze o cos konkretniejszego, bo mi za nic sie nie chce to wyrysowac.

Poczytaj w Assistancie co to takiego jest relacja parent-child

0
MasterBLB napisał(a)

Przypisywać qlabele do widgeta to akurat przypisuje poprzez wywołania (zbyteczne o 1szy argument btw):

new QLabel(0,this)

w konstruktorze MainWindowa

Hmm ... Mógłbyś powiedzieć gdzie jest informacja o tym? Szczerze mówiąc nie spotkałem się jeszcze z czymś takim, dlatego trochę mnie to zdziwiło.

0
Blood napisał(a)
MasterBLB napisał(a)

Przypisywać qlabele do widgeta to akurat przypisuje poprzez wywołania (zbyteczne o 1szy argument btw):

new QLabel(0,this)

w konstruktorze MainWindowa

Hmm ... Mógłbyś powiedzieć gdzie jest informacja o tym? Szczerze mówiąc nie spotkałem się jeszcze z czymś takim, dlatego trochę mnie to zdziwiło.

Podając wskaźnik this MainWindowa w konstruktorze QLablea autor zarazem tworzy relację parent-child-a to potemu,ze MainWindow jest potomkiem QWidgeta

0

Z tego co pokazuje Qt mamy taka hierarchie
Obiekt MainWindow - Klasa QMainWindow
Obiekt centralWidget - Klasa QWidget

Jakby nie patrzec QWidget jest czescia QMainWindow, wiec wychodzi jakoby QWidget, byl bardziej potomkiem QMainWindow?

W kazdym razie ja pisalem o odrysowanie pewnych czescie deklarowanych poza glownym konstruktorem okna. Probowalem juz this->update() tez nie dziala. Any ideas?

0

sigh*....jak BYK stoi w dokumentacji QMainWindow "Inherits QWidget."

Co do pomysłów-weź spakuj projekt z zapodaj zipa + powiedz dokładnie,jakiego działania oczekujesz od programu.

0

Nie irytuj sie tak, bo ci zylka peknie... Jezu ja zadalem pytanie nie stwierdzilem cos. Dalem klase mainwindow i spytalem jedynie w jaki sposob po utworzeniu okna przez konstruktor dodac cokolwiek, czyli dorysowac juz na gotowym oknie. Jak na razie zadne podane metody nie zadzialaly...

0

Już chyba ze 3 razy byłeś proszony o kod, wtedy będziemy w stanie Ci więcej poradzić, ale coś CI ten kawałek umyka ;)

0

OMG Jak byk wkleilem w pierwszym poscie cala klase MAINWINDOW, ktora jest odpowiedzialna za wyswietlanie. Nic wiecej z kodu nie jest potrzebne bo reszta to jest warstwa logiczna i kontroler, no ale dobra, zeby nie bylo dam jeszcze raz...

mainwindow.h

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QApplication>
#include <QMainwindow>
#include <QTextCodec>
#include <QPushButton>
#include <QLabel>
#include <QMenuBar>
#include <QStatusBar>
#include <QGridLayout>
#include "gra.h"

class MainWindow : public QMainWindow
{
   Q_OBJECT

private:
   QPushButton *ruch,*kup,*sprzedaj;
   QPushButton *butlab;

   QLabel *label;
   QLabel *poleGry;
   QLabel *pionek0,*pionek1,*pionek2,*pionek3;
   vector<QLabel*>konta;

   QMenu *menu;
   QMenu *setPlayer;

   QAction *player2;
   QAction *player3;
   QAction *player4;
   QAction *quitAction;

   gra *plansza;

   void createMenus();
   void movePlayer(int nr, int poz);
   void moveP2(int nr, int cel);

   int g0,g1,g2,g3; //tymczasowe pol graczy
   int ktory; //zapamietujemy czyja kolej
   int ile_graczy;

public:
   MainWindow();
private slots:
   void SetPlayerCount2();
   void SetPlayerCount3();
   void SetPlayerCount4();
   void move();
};

#endif // MAINWINDOW_HPP

mainwindow.cpp

#include "mainwindow.h"

int tabx[40]={487,416,377,338,299,260,223,184,145,106,34,34,34,34,34,34,34,34,34,34,34,106,145,184,223,260,299,338,377,416,487,487,487,487,487,487,487,487,487,487};
int taby[40]={547,547,547,547,547,547,547,547,547,547,547,476,437,398,360,321,282,244,205,166,93,93,93,93,93,93,93,93,93,93,93,166,205,244,282,321,360,398,437,476};

MainWindow::MainWindow()
{
   createMenus(); //wywolanie funkcji rysujacej MENU
   setMinimumSize(520,580);
   setMaximumSize(520,580);

   ruch = new QPushButton(tr("&Ruch"),this);
   ruch->setGeometry(10,30,100,30);
   ruch->connect(ruch,SIGNAL(clicked()),this,SLOT(move()));

   kup = new QPushButton(tr("&Kup"),this);
   kup->setGeometry(120,30,100,30);
   kup->setEnabled(false);

   sprzedaj = new QPushButton(tr("&Sprzedaj"),this);
   sprzedaj->setGeometry(230,30,100,30);
   sprzedaj->setEnabled(false);

   QPixmap pixmap1(QCoreApplication::applicationDirPath()+"/obrazki/plansza.png");
   poleGry = new QLabel(0,this);
   poleGry->setGeometry(10,70,500,500);
   poleGry->setPixmap(pixmap1.scaled(500,500));

   pionek0 = new QLabel(0,this);
   pionek0->setGeometry(487,547,15,15);
   QPixmap pionekpix0(QCoreApplication::applicationDirPath()+"/obrazki/czerwony.png");
   pionek0->setPixmap(pionekpix0.scaled(15,15));

   pionek1 = new QLabel(0,this);
   pionek1->setGeometry(487,530,15,15);
   QPixmap pionekpix1(QCoreApplication::applicationDirPath()+"/obrazki/niebieski.png");
   pionek1->setPixmap(pionekpix1.scaled(15,15));

   pionek2 = new QLabel(0,this);
   pionek2->setGeometry(470,547,15,15);
   QPixmap pionekpix2(QCoreApplication::applicationDirPath()+"/obrazki/zielony.png");
   pionek2->setPixmap(pionekpix2.scaled(15,15));

   pionek3 = new QLabel(0,this);
   pionek3->setGeometry(470,530,15,15);
   QPixmap pionekpix3(QCoreApplication::applicationDirPath()+"/obrazki/rozowy.png");
   pionek3->setPixmap(pionekpix3.scaled(15,15));

   g1=g0=g2=g3=0;
   ktory=0;
}

void MainWindow::move()
{
    movePlayer(ktory,plansza->lista_graczy[ktory]->ruch());
    ktory++;
    plansza->lista_graczy[0]->mandat(6000);
    if(ktory==plansza->ilosc_graczy())
    {
        for(int i=0;i<plansza->ilosc_graczy();i++)
        {
            if(plansza->lista_graczy[i]->bankrut()==false)
            {
                ktory=i;
            }
            else
            {
                if(i==1)pionek1->hide();
                if(i==2)pionek2->hide();
                if(i==3)pionek3->hide();
                if(i==0)pionek0->hide();
            }

        }
        ktory++;
    }
}

void MainWindow::createMenus()
{
   menu = menuBar()->addMenu(tr("&Menu"));
   setPlayer = menu->addMenu(tr("&Ilosc graczy"));
   player2 = new QAction(tr("&2 Graczy"),this); //tworze przyciski ktore maja ustawic ilosc graczy i wyswietlic odpowiednie labele
   player3 = new QAction(tr("&3 Graczy"),this);
   player4 = new QAction(tr("&4 Graczy"),this);

   quitAction = new QAction(tr("&Wyjscie"), this);
   quitAction->setStatusTip(tr("Wyjdz z programu"));
   connect (quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));

   setPlayer->addAction(player2);
   connect (player2, SIGNAL(triggered()), this, SLOT(SetPlayerCount2())); // podpinam przyciski pod sloty
   setPlayer->addAction(player3);
   connect (player3, SIGNAL(triggered()), this, SLOT(SetPlayerCount3()));
   setPlayer->addAction(player4);
   connect (player4, SIGNAL(triggered()), this, SLOT(SetPlayerCount4()));

   menu->addAction(quitAction);
}

void MainWindow::SetPlayerCount2()   // wywolanie funkcji dla 2 graczy
{                                                   
    konta.resize(2);
    plansza = new gra(2);
    for(int i=0;i<2;i++)
    {
        konta[i] = new QLabel(0,this); // nowy label
        konta[i]->setText("aaaaaaaaaaaaaaaaaaaa"); // tekst
        konta[i]->setGeometry(15,15,100,30); // polozenie i rozmiar w oknie
    }
    this->update(); // teoretycznie odswiezenie okna i powinno mi wyrysowac ale nei rysuje
}
void MainWindow::SetPlayerCount3()   
{                                                   
    konta.resize(3);
    plansza = new gra(3);
    for(int i=0;i<3;i++)
    {
        konta[i] = new QLabel(0,this);
        konta[i]->setText("aaaaaaaaaaaaaaaaaaaaaa");
        konta[i]->setGeometry(15,15,100,30);
    }
    this->update();
}
void MainWindow::SetPlayerCount4()   
{                                                   
    konta.resize(4);
    plansza = new gra(4);
    for(int i=0;i<4;i++)
    {
        konta[i] = new QLabel(0,this);
        konta[i]->setText("aaaaaaaaaaaaaaaaa");
        konta[i]->setGeometry(15,15,100,30);
    }
    this->update();
}

Nie daje calego .cpp bo tylko bedzie niepotrzebnie mieszal. To jest glowna czesc

0

Dobra widze, ze i tak nikt albo nie wie, albo nie kwapi sie zbytnio zeby pomoc. Poradzilem sobie z tym w inny sposob juz, bez zadnego odswiezania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1