przekazywanie obiektów z ui::MainWindow do innych klas

Odpowiedz Nowy wątek
2013-09-13 17:24
0

Jeżeli tworzę np statusbar w designerze i chce wszystkie operacje z nim związane oddelegować do osobnej klasy a w klasie MainWindow umieścić zmienną tej klasy to w jaki sposób powiązać moja klase z obiektem
ui->staus_bar_z_designera ? na zagranicznym forum znalazłem rozwiązanie w postaci przeniesienia *Ui::MainWindow ui;** z sekcji private klasy MainWindow do public i dziedziczenie tej klasy w mojej ale to nie wydaje mi się najszczęśliwszym rozwiązaniem... przykład

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    MyStatusBar * main_statusbar; // tutaj moja klasa
};

i teraz w konstruktorze MainWindow

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    main_statusbar = new MyStatusBar( this );
    main_statusbar->init( ui->status_bar_z_designera );
}
edytowany 4x, ostatnio: emacs, 2013-09-13 17:37

Pozostało 580 znaków

2013-09-13 17:52
1

W qt na prawie na wszystkie problemy odpowiedzią są sygnały i sloty.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    p = new LogikaDlaStatusBara(this);
    connect(p, SIGNAL(newInfo(QString)), 
            ui->status_bar_z_designera, SLOT(showMessage (QString)));
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2013-09-13 20:14
0

Czyli tworzę swoją klasę statusbara która nie zawiera obiektu QStatusBar a tylko same metody i później podłączam konkretna metodę z p do faktycznego obiektu ui->status_bar_z_designera?

edytowany 1x, ostatnio: emacs, 2013-09-13 22:33

Pozostało 580 znaków

2013-09-14 12:00
0

OK tylko linijką p = new LogikaDlaStatusBara(this); tworzę i umieszczam na formie już 2 statusbara... bo szkielet tej klasy wygląda mniej więcej tak

class MyStatusBar : public QStatusBar
{
    Q_OBJECT

public:
    MyStatusBar( QWidget * parent = 0 );

signals:
    void out( QString );

};

więc mam w oknie 2 statusbary ( w tym jednego niechcianego ;d ), muszę każdą metodę / sygnał połączyć z odpowiednim slotem klasy statusbara i później tą metodę / sygnał wywołać i....czy to nie jest robienie sobie pod górkę? bo z tego wychodzi że napiszę więcej kodu który znajdzie się w konstruktorze klasy MainWindow a nie o to mi chodziło chcąc przenieść logikę do osobnej klasy. Chyba że czegoś nie rozumiem ( co jest bardzo możliwe ) i gadam głupoty, jeżeli tak to wyjaśnijcie mi w skrócie zasadę, będę wdzięczny za przykład prototypu prostej klasy która odpowiada za czynności wykonywane na jakimś obiekcie umieszczonym na formie ui->jakis_obiekt_z_designera
Ogólnie moim celem jest uzyskanie czegos takiego

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    MyStatusBar * main_statusbar;
};

i w konstruktorze ograniczam sie do

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    // tu jakies operacje

    main_statusbar = new StatusBar( ui->statusBar );
    main_statusbar->setting(); // gdzie w setting ustawiam wszystko co jest mi potrzebne
}
edytowany 2x, ostatnio: emacs, 2013-09-14 12:33

Pozostało 580 znaków

2013-09-14 13:38
0

Zrob klase dziedziczaca po statusbarze, przedefiniuj konstruktor kopiujacy, zeby ustawial odpowiednio wyglad, layout, etc., a w konstruktorze okna glownego daj cos takiego:

mojStatusBar = new MojStatusBar(staryStatusBar);
delete staryStatusBar;

Pozostało 580 znaków

2013-09-14 23:35
0

Napisz dokładnie co chcesz zrobić, bo jak na razie sypiesz takimi ogólnikami, że trudno nie robić tego samego.
Status bar jest ma bardzo prostą funkcjonalność, więc zupełnie nie rozumiem czemu tak strasznie kombinujesz.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2013-09-14 23:36

Pozostało 580 znaków

2013-09-15 10:43
0

Postaram się wytłumaczyć o co mi chodzi ;) Otóż nie wszystkie rzeczy mogę wykonać w designerze qt, chciałbym mieć statusbara z informacjami o działaniu programu + np aktualna data / godzina. I teraz statusbara wrzucam sobie na formę a na całą logikę chciałem napisać osobną klasę której zmienną wrzucałbym po prostu do klasy MainWindow, w konstruktorze inicjalizował ją przekazując wskaźnik do tego statusbara z formy i operował na nim poprzez ta klasę ale teraz już nie jestem pewny czy to dobry pomysł. Podstawowe pytanie Czy powinienem logikę elementów które wrzuciłem na formę obsługiwać bezpośrednio w klasie MainWindow poprzez tworzenie w niej odpowiednich do tego metod czy raczej na każdy ( prawie każdy ) element z formy ( np statusbar, menu, edit ) budować osobne klasy opakowując dodatkowo operacje na tych elementach?
Bezposrednio w MainWindow byłoby o wiele łatwiej to wszystko obsługiwać minusem jest to że cała klasa, w tym konstruktor mógłby się nieźle rozrosnąć. Nie pisałem jeszcze żadnego większego projektu z GUI dlatego nie wiem jak to powinno być rozwiązane i stąd moje pewnie banalne pytanie ;) Dzięki za odpowiedzi.

Pozostało 580 znaków

2013-09-15 12:45
0

Za dużo kombinujesz. Jeżeli chcesz coś takiego to dużo prościej i poprawniej przekazać wskaźnik mainwindow do klasy obsługującej statusbar a w mainwindow zrobić publiczną metode setLabelStatusBar(Qstring text) którą będziesz wywoływał z klasy obsługującej status bar.

Pozostało 580 znaków

2013-09-15 22:51

Emacs,masz 2 drogi do dodania customowego widgeta do szablonu tworzonego w Designerze.
1,to stworzyć sobie własną klasę w .h i wypromować widget do tej klasy.
2,napisać plugin do Designera.
W przypadku własnego status bara to polecam sposób 1.Daj na Object Inspector,kliknij prawym w QStatusBara od tego swojego okna i zapodaj 'Promote to' po czym podaj nagłówek do swojego status bara.

Odpowiadając na pytanie co do logiki,czy w osobnej klasie czy w main window - zależy.Jeśli oddzielna klasa stanowiłaby koherentną całość w której nie miałbyś potrzeby grzebania co chwilę,i miałaby potencjalne zastosowanie nie tylko w tym jedym main window to wtedy lepiej dać jako oddzielną klasę.

Z opisu

emacs napisał(a):

Otóż nie wszystkie rzeczy mogę wykonać w designerze qt, chciałbym mieć statusbara z informacjami o działaniu programu + np aktualna data / godzina.
wynika,że w tym przypadku imho lepiej byłoby mieć oddzielną klasę.


"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, 2013-09-15 22:52
Dzięki, promowanie było tym czego potrzebowałem ;) Chociaż MarekR22 tez podał ciekawe rozwiązanie w każdym razie problemu już nie mam ;) - emacs 2013-09-17 18:10

Pozostało 580 znaków

2013-09-15 23:48
0

Dzieki MasterBLB

Odpowiadając na pytanie co do logiki,czy w osobnej klasie czy w main window - zależy.Jeśli oddzielna klasa stanowiłaby koherentną całość w której nie miałbyś potrzeby grzebania co chwilę,i miałaby potencjalne zastosowanie nie tylko w tym jednym main window to wtedy lepiej dać jako oddzielną klasę.

Raczej byłaby to dedykowana klasa konkretnie dla tej aplikacji, a wszystko po to żeby nie zaśmiecać MainWindow niezliczona liczbą zmiennych / metod. Baa gdy jakiś element od podstaw wstawiam w kodzie to nie ma problemu gorzej gdy część pracy związanej z jakimś obiektem ( np statusbarem ) dla ułatwienia wykonam sobie w designerze a resztę chciałbym obsłużyć w osobnej klasie bo widzę że nie jest to takie kolorowe... także raczej obsłużę wszystko właśnie w MainWindow, bez komplikowania sobie życia. Szkoda bo na pewno lepiej wygląda to

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    MyStatusBar * statusbar;
};

niż to

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    void statusbar_set_info();

public slots:
    QString system_time();

private:
    Ui::MainWindow *ui;
    QLabel * firstlabelstat;
    QLabel * secondlabelstat;
    QLabel * timelabelstat;
    QToolButton * button_info_stat;
};
edytowany 1x, ostatnio: emacs, 2013-09-15 23:55

Pozostało 580 znaków

2013-09-16 16:25
0

A używając zaproponowanego sposobu nr 1 miałbyś po prostu

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;//MyStatusBar siedzi w ui i nie trzeba się cackać w oddzielne dodawanie go do okna
};

:]

Ale,weź napisz dokładnie jaki efekt chcesz uzyskać,bo na razie to ja nie dostrzegam czemu standardowy QStatusBar miałby nie wystarczyć.


"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 :]

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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