Qt exec vs show

0

Cześć,
mam pytanko o Qt, jaka jest różnica pomiędzy metodą show a exec ( exec wzieło się od executive? )?

I jeszcze jedno pytanko, dlaczego program główny Qt zwraca:

 
    return a.exec();

dlaczego nie jest klasyczne return 0 ?
Dziękuję za pomoc : D

1

Raczej od execute. show() pokazuje widget ale nie blokuje wykonania i nie odpala własnego eventloopa w tym miejscu. exec() przeciwnie.

2

exec jest blokujące, uruchamia własny eventLoop i pozwala na zwrócenie kodu wykonania. Najczęście jest to stosowane z oknami dialogowymi (blokującymi).
show jest nieblokujące (asynchroniczne) i uruchamia okno w ramach bieżącego event loop-a.

exec z QApplication nie odpala żadnego okna, ale startuje event loop-a i przekazuje wynik wykonania aplikacji (w praktyce ten kod jest użyteczny dla aplikacji nieokienkowych, oczywiście nie jest to ścisła reguła).

0

event loop to jest jakaś pętla w programie która czeka na zdarzenia ( np. kliknięcie przycisku )?

2
Samiec Alfa napisał(a):

event loop to jest jakaś pętla w programie która czeka na zdarzenia ( np. kliknięcie przycisku )?

Mniej więcej. Nie wiem jak to wygląda na Linuksie, ale pod Windowsem najprostsza możliwa pętla zdarzeń składa się z dwóch wywołań Win32 API:

while (GetMessage(...))
   DispatchMessage(...);

Podobna pętla (bardziej rozbudowana oczywiście) jest zawarta w Qt. Funkcja GetMessage jest blokująca i czeka na zdarzenie (komunikat). DispatchMessage przekazuje odebrany komunikat do procedury okna (window procedure), która też jest częścią Qt i tam dopiero pojawia się obsługa odpowiednich sygnałów i slotów.

Oznacza to że kiedy program nic nie robi i nic się z nim nie dzieje, przez większość czasu wisi wewnątrz GetMessage¹.
A z drugiej strony, większość napisanego przez nas kodu jest wywoływana pośrednio przez DispatchMessage.

¹) nie analizowałem źródeł Qt i nie robiłem pomiarów - nie musi to być prawda.

0

Dziękuję bardzo za pomoc : )

0

Jeszcze taka myśl mnie naszła, czy jeżeli w programie w funkcji main jest stworzone okno aplikacji i na tym obiekcie jest wywołane exec () to kiedy wykona się funkcja return a exec () i co ona zrobi? Czy qapplication wie że wszystkie okna są zamknięte i wyłączy program? Bo jak dobrze rozumiem to program do tej funkcji dojdzie jak zamknę okno (wywołane funkcją exec)

0

return wykona się oczywiście po zakończeniu funkcji a.exec(), czyli po zamknięciu głównego okna.
to właśnie ten return powoduje zakończenie programu.

return w funkcji main zwraca wartość do systemu operacyjnego, tzw. kod wyjścia. zazwyczaj jest to zero, oznaczające że program zakończył się bez błędu.
jest to wartość ignorowana przez system, ale może być wykorzystana np. gdy jeden program wywołuje drugi. wtedy ten wywołujący może odebrać wartość zwracaną przez main programu wywoływanego.

0

Dziękuję to jest jasne : ) ale jedna rzecz nie daje mi spokoju:
Program główny:
Tworzy obiekt klasy mainwindow
Wywołuje na nim metode show

I tutaj jest pytanie, dlaczego show a nie exec skoro exec jest blokujące a show tylko wyświetla? Nie powinno być exec żeby wywołać tą pętle która czeka na jakiś sygnał? Blokująca instrukcja jest wykona na obiekcie qapplication.

Jak Ktoś ma jeszcze tyle cierpliwość aby to wytłumaczyć to byłbym bardzo wdzięczny : D

0

W skrócie: show pokazuje okno, ale exec czeka i reaguje na zdarzenia, np. utworzenie czy zamknięcie okna.

Utwórz w QTCreatorze nowy projekt, defaultowo powinnien zostać wygenerowany kod pi razy oko w tym stylu:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

Sprawdź co się stanie po podmianie return a.exec() na return 0, to powinno wiele wyjaśnić :)

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