QT-wyśrodkowanie pozycji QLabel, błędny wskaźnik

QT-wyśrodkowanie pozycji QLabel, błędny wskaźnik
PU
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:24
0

witam, mam problem z tą funkcją:

Kopiuj
void MainWindow::CreateChessBoard()
{
    ChessboardFrame = new QLabel(this);
    ChessboardFrame->resize(700,700);
    ChessboardFrame->move(0,0);
    ChessboardFrame->setAlignment(Qt::AlignVCenter);
    int x=75;
    int y=75;
    int c=75;
    Chessboard = new QLabel *[8];
    for(int i=0; i<8; ++i)
    {
        Chessboard[i] = new QLabel[8];
    }
    for(int i=0; i<8; ++i)
    {
        for(int j=0; j<8; ++j)
        {
            if(i%2==0)
            {
                if(j%2==0)
                {
                    Chessboard[i][j].setParent(ChessboardFrame);
                    Chessboard[i][j].setStyleSheet("QLabel { background-color : black; }");
                    Chessboard[i][j].resize(c,c);
                    Chessboard[i][j].move(x,y);
                    Chessboard[i][j].setText("Czarne");
                    //Chessboard[i][j].;
                }
                else
                {
                    Chessboard[i][j].setParent(ChessboardFrame);
                    Chessboard[i][j].setStyleSheet("QLabel { background-color : white; }");
                    Chessboard[i][j].resize(c,c);
                    Chessboard[i][j].move(x,y);
                    Chessboard[i][j].setText("Biale");
                    //Chessboard[i][j].;
                }
            }
            else
            {
                if(j%2==0)
                {
                    Chessboard[i][j].setParent(ChessboardFrame);
                    Chessboard[i][j].setStyleSheet("QLabel { background-color : white; }");
                    Chessboard[i][j].resize(c,c);
                    Chessboard[i][j].move(x,y);
                    Chessboard[i][j].setText("Biale");
                    //Chessboard[i][j].;
                }
                else
                {
                    Chessboard[i][j].setParent(ChessboardFrame);
                    Chessboard[i][j].setStyleSheet("QLabel { background-color : black; }");
                    Chessboard[i][j].resize(c,c);
                    Chessboard[i][j].move(x,y);
                    Chessboard[i][j].setText("Czarne");
                    //Chessboard[i][j].;
                }
            }
            x+=c;
        }
        x=c;
        y+=c;
    }
} 

1/chodzi o to, że program uruchamia się poprawnie (w trybie debug) ale wyrzuca info "invalid pointer".
2/Potrzebuję wyśrodkować QLabel w którego środku znajdują się czarno-białe prostokąciki :). Myślałem nad tym żeby pobrać rozmiar okna i przeliczyć sobie gdzie powinno znajdować się chessBoardFrame jednak nie umiem znaleźć klasy odpowiedzialnej za to działanie.
3/Jak sprawić aby okno dopasowywało się do wielkości szachownicy. W tej chwili zachowuje się tak jakby wielkość miało wpisaną na stałe. Może znów powinienem pobierać wielkość ChessBoardFrame i po odpowiedniej modyfikacji jakoś ustawiać wielkość tego okna(tylko jak?).

edytowany 1x, ostatnio: Puchaczov
R9
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 10 lat
0

Nie lepiej użyć Buttonów? Mają przynajmniej sygnał kliknięcia.
Powinieneś użyć layouta, np. QGridLayout. Poczytaj też o tym, co zrobić żeby widget był kwadratowy (wystarczy że widget zawierający tą szachownicę będzie kwadratowy). QLabel nie jest dobrym "kontenerem" (jako kontener powinno się używać samego QWidgeta).

Swoją drogą można te generowanie uprościć: (i+j)%2==0 :p Wtedy true jest wtedy, gdy obie są parzyste lub nieparzyste, a false gdy jedna z nich nieparzysta. Tak więc dla jednego rządu true będą parzyste, a dla drugiego nieparzyste.

Jeszcze lepszym rozwiązaniem jest użycie QGraphicsView i sceny.

Co do invalid pointer, to chodzi o przetrzymywanie QLabeli. Problem jest taki, że widgety powinno się przetrzymywać jako wskaźniki, nawet jeśli są w tablicy. Inaczej mówiąc: nie **QLabel, tylko jak już to ***QLabel

//EDIT: Ucięło gwiazdki, poprawiłem

edytowany 1x, ostatnio: Razi91
MasterBLB
A nawet QLabel* ;)
PU
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:24
0

Dobra, zmieniłem nieco podejście i zgodnie z Waszymi wskazówkami staram się używać layoutów. Mam jednak problem bo z mojej szachownicy wyświetla się jedynie pierwszy wiersz i ostatnia kolumna. Zastanawiam się czy w ogóle można łączyć VBoxLayout z GridLayouti czy nie to stanowi problem.

Kopiuj
 #include <mainwindow.h>
void ChessOperations::addChessBoard(QWidget *&Widget)
{
    HBoxLayout=new QHBoxLayout();
    ChessBoard=new QGridLayout();
    VBoxLayout=new QVBoxLayout(Widget);
    ChessFields=new QPushButton[64];
    PlayerMovement=new QPushButton("do Something");
    LineEdit=new QLineEdit();
    HBoxLayout->addWidget(PlayerMovement);
    HBoxLayout->addWidget(LineEdit);
    for(int i=0; i<8; ++i)
    {
        for(int j=0; j<8; ++j)
        {
            if(i%2==0)
            {
                if(j%2==0)
                {
                    (ChessFields+i+j)->setStyleSheet("background-color: white");
                }
                else
                {
                    (ChessFields+i+j)->setStyleSheet("background-color: black");
                }
            }
            else
            {
                if(j%2==0)
                {
                    (ChessFields+i+j)->setStyleSheet("background-color: black");
                }
                else
                {
                    (ChessFields+i+j)->setStyleSheet("background-color: white");
                }
            }
            ChessBoard->addWidget(ChessFields+i+j, i, j);
            ChessBoard->setSpacing(0);
        }
    }
    VBoxLayout->addLayout(HBoxLayout);
    VBoxLayout->addLayout(ChessBoard);
    Widget->setLayout(VBoxLayout);
}
R9
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 10 lat
0

Po co podajesz Widgeta zarówno w konstruktorze layoutu jak i potem znów przypisujesz layout do tego widgetu?

Dalej robisz ten sam błąd: new QPushButton[64];. powinno być new QPushButton*[64]; i każdy button tworzony osobno, inaczej jest problem z czyszczeniem.

No i źle się też poruszasz po tablicy. przemieszczasz o +i+j, powinno być raczej +i+8*j.

Co do stylu: przypisujesz je globalnie, tzn. na cały obszar, a nie sam przycisk, dlatego jest na cały obszar widgetu. "QPushButton{background-color: white:} jest lepszym wyjściem, jeśli buttony mają być rysowane.

Trochę mi się nudziło, w C++ i Qt dawno nie pisałem, więc tak dla przypomnienia napisałem generowanie szachownicy i gotowy mechanizm eventów. Klasa Field rozszerza QPushButton, może przechowywać info o swoich współrzędnych, typie figury jaka się na nim znajduje i właścicielu. Dzięki temu może wyemitować przy kliknięciu sygnał mouseClicked zawierający w argumentach swoje współrzędne (nie trzeba potem wg. źródła szukać).
Poza tym jest nadpisana metoda rysująca dzięki czemu można narysować sobie na tym buttonie co się chce, polecam zapoznać się z QPainter i rysowaniem plików SVG, grafiki znajdziesz na np. http://www.openclipart.org/ .

Poza tym jest tam też przykład widgetu który zawsze jest kwadratowy (tak, wiem, użyłem prymitywnego boolowego locka, ale działa)

Projekt w załączniku.

PU
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:24
0

Nie mogę tego ogarnąć. Jak dam QPushButton *** cos; i stworze sobie powiedzmy te 64 buttony to jak się do nich odwołać?

cos[i][j]->zrob_cos(); ?

MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:2 dni
  • Lokalizacja:Warszawa
  • Postów:1454
0

Zamotałeś za bardzo
Primo,jeśli ja chciałbym mieć szachownicę,to zrobiłbym ją jako 1 QWidget z własnym paint eventem malującym pola.
Secundo,jeśli już koniecznie chciałbym,aby każde pole szachownicy było osobnym widgetem oparłbym je na podstawowym QWidgecie.Tworzylyby układ 8x8 i wsadzone byłyby w grid layout,który siedziałby w jakimś zbiorczym QWidgecie.Podejście to ma pewną wadę polegającą na tym,że w przypadku szachownicy mogącej zmieniać rozmiar będzie trochę zabawy z ograniczeniem kształtu widgetów do kwadratu.Dlatego lepiej mieć 1 nadrzędnego widgeta na to


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB
PU
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:24
0

problem w tym, że taki sposób jak opisałem wyżej nie działa. Zwraca, że program nieoczekiwanie zakończył działanie. A z QT dopiero zaczynam w związku z czym uczę się robiąc projekt gry w szachy.

MasterBLB
Naucz się używać Designera do tworzenia form.Moocno ułatwia zabawy z layoutem,ponadto od razu masz podgląd,jak będzie wyglądało po uruchomieniu to co piszesz
PU
próbowałem tylko, że miałem spory problem z podłączeniem slotów do tego co zrobiłem. Zdecydowanie lepiej mi wychodzi napisanie samemu tego xD
MasterBLB
Gdzie tu jest problem??Dostajesz klasę Ui::nazwaFormy,w której wszystko co do niej wsadziłeś siedzi.Tworzysz zatem jej instancję,wywołujesz uiInstanceName.setupUI(this) a potem masz np connect(uiInstanceName.someButtonOnForm,SIGNAL(clicked()),this,SLOT(whatever()));
0
Puchaczov napisał(a)

A z QT dopiero zaczynam w związku z czym uczę się robiąc projekt gry w szachy.

tylko że twój problem nie wynika bezpośrednio z nieznajomości Qt, a podstaw samego języka, w którym wykorzystujesz ten framework. Tworzysz takie konstrukcje, a nie potrafisz ich wykorzystać. Qt za ciebie nic nie wymyśli, jedynie pomoże zrealizować i ułatwić dążenie do rozwiązania problemu, który sobie wyznaczysz.

PU
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:24
0

Tak, to prawda. Jednak nie wiem jak się odnieść do takiego wskaźnika i proszę o pokazanie mi tego :)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)