Widgety stworzone w designerze Qt, a wygenerowany kod (UI)

0

Witam ponownie,
Mam następujące pytanie: gdy tworzę sobie główne okno w Qt designerze (creatorze) to wygeneruje mi się kod dla klasy MainWindow, która dziedziy po QMainWindow.
Natomiast, gdy dodam sobie jakiś button lub cokolwiek to ta informacja nie jest dodawana do mojej klasy tzn. nie mam żadnego obiektu typu QButton ani wskaźnika na taki obiekt etc.
Mam za to coś takiego jak Ui::MainWindow *ui;
Jeśli chcę np. zmienić text w label-u to muszę się odwołać przez to ui.
Mam więc pytanie czym jest to "ui" (User Interface?) i czemu w mojej klasie MainWindow brakuje zdefiniowanych obiektów klasy button lub chociaż wskaźników na nie?

Pytam, bo w kursach dot. Qt obiekty typu button tworzone są wewnątrz danej klasy...
Z góry dzięki za wyjaśnienie.

0

Musisz stworzyć slot do tego buttona. Klikasz na niego Prawym Przyciskiem Myszy(PPM)-> wybierasz go to slots, wybierasz odpowiednią akcję z menu slotów np clicked() i automatycznie przechodzi Ci do kodu :). Później jak chcesz się odwołać do tego buttona to ui->button1->... (oczywiście poza funkcją buttona)

0

Ale mi nie chodzi jak się odwołać do tego buttona czy innego widgeta, tylko, że nie ma takiego obiektu ani wskaźnika do obiektu w klasie MainWindow.
Natomiast ui jest wskaźnikiem właśnie do obiektu typu MainWindow... Więc skąd możliwość odwołania się do tego buttona czy czegokolwiek przez ui, jak w klasie MainWindow nie ma takich obiektów?!

0

czytałeś co napisałem ? Naciśnij prawym przyciskiem myszy na button graficzny, wybierz "slots", tam wybierz np. "clicked" i automatycznie zrobi Ci sie ten obiekt w klasie..

0
Resident napisał(a):

czytałeś co napisałem ? Naciśnij prawym przyciskiem myszy na button graficzny, wybierz "slots", tam wybierz np. "clicked" i automatycznie zrobi Ci sie ten obiekt w klasie..

Zrobiłem 2 przyciski i 1 etykietę. Po naciśnięciu PPM -> przejdź do slotu -> clicked() dodaje mi się nowa funkcja np. on_pushButton_clicked(), ale żaden obiekt mi się nie dodaje do klasy MainWindow

całość pliku mainwindow.h wygląda tak:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Jeśli w klasie MainWindow brak obiektu typu label, button etc. (lub wskaźników do nich) to czemu mogę się do nich odwołać przez ui, które jest przecież wskaźnikiem do tego (takiego samego) obiektu...

0

fantastyczny tutorial designera na yt przeleć go a będziesz śmigał po nim łatwo

0

Dzięki - już wcześniej go znalazłem i zamierzałem obejrzeć ;).
Natomiast co do mojego pytania to chyba znalazłem na nie odpowiedź: zdaje się, że funkcja setupUi(this) jest odpowiedzialna za utworzenie tych widgetów, które są przechowywane w pliku XML - jak jest taka możliwość to prosiłbym o potwierdzenie.

Mam przy okazji jeszcze jedno pytanie: czy jeśli utworzę sobie np. button w designerze a następnie utworzę slot to czy jest możliwość, by później zmienić nazwę tego buttona?
W których plikach muszę dokonać modyfikacji? Próbowałem zmienić w pliku .ui ale to nic nie pomogło (funkcja nie działała po zmianie nazwy)

Jeszcze przy okazji chciałem zapytać o możliwość zmiany nazw slotów po wygenerowaniu ich przez designer - czy jest taka możliwość? Jak zmienię nazwę w pliku .h i odpowiednio .cpp to nie działają...

0
CppBeginner napisał(a):

Dzięki - już wcześniej go znalazłem i zamierzałem obejrzeć ;).
Natomiast co do mojego pytania to chyba znalazłem na nie odpowiedź: zdaje się, że funkcja setupUi(this) jest odpowiedzialna za utworzenie tych widgetów, które są przechowywane w pliku XML - jak jest taka możliwość to prosiłbym o potwierdzenie.

Mam przy okazji jeszcze jedno pytanie: czy jeśli utworzę sobie np. button w designerze a następnie utworzę slot to czy jest możliwość, by później zmienić nazwę tego buttona?
W których plikach muszę dokonać modyfikacji? Próbowałem zmienić w pliku .ui ale to nic nie pomogło (funkcja nie działała po zmianie nazwy)

jeżeli tworzysz ui z designera to po odpaleniu qmake, moc jest budowany na podstawie danych ustawionych w pliku ui;

możesz zmienić nazwę buttona w designerze -> http://i.imgur.com/igeC8ST.png

obejrzyj te yt movies zanim zadasz kolejne proste pytania

0

Dzięki @gośćabc za odpowiedź. Jestem w trakcie oglądania tych filmików ale pytania same się nasuwają i chcę je na bieżąco rozwiewać ;-).
Zmienić nazwę oczywiście w designerze mogę. Problem jest jednak taki, że jak utworzę button i nadam mu nazwę np. button1 -> a następnie utworzę do niego slot tj. wygeneruje mi się kod z funkcją w której coś zaimplementuję -> a następnie będę chciał zmienić nazwę tego button na buttonX to jak zrobię to w designerze to mój slot przestanie działać.
Reasumując: po wygenerowaniu slota nie można modyfikować nazwy widgeta?!

Co ciekawe, jeśli wygeneruje mi się slot (funkcja odpowiedzialna np. za wciśnięcie buttona) i będę chciał zmienić jej nazwę na jakąś własną to mimo, że zmienię tą nazwę w pliku .h i .cpp to mimo wszystko nie będzie ona działać ;-(.

Przynajmniej do takich wniosków doszedłem.

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