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

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 );
}
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)));
}
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?

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
}
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;
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.

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.

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.

1

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ę.

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;
};
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ć.

0

Standardowy QStatusBar wystarcza, post wyżej podałem dlaczego chce to opakować w osobna klasę - żeby nie mieć takiego syfu w głównej klasie okna czyli MainWindow bo jeżeli zamykam wstawione w designerze elementy w osobne klasy to w nich mam wszystkie zmienne, metody, sygnały odpowiedzialne za obsługę tych konkretnych elementów a jeżeli obsługuje to bezpośrednio w MainWindow poprzez ui->statusbar->cos_tam czyli tak jak podałem post wyżej wszystkie zmienne potrzebne do obsługi ląduja w sekcji private klasy MainWindow i robi się nieciekawie bo po chwili mam tam 20 zmiennych, 16 metod, sygnały / sloty... mam nadzieje że teraz rozumiesz o co mi chodzi? ;) Wydaje mi się że promowanie widgetu jest tym czego mi potrzeba

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