Многооконная и многопоточная архитектура Qt

Я новичок в Qt5 и работаю над встроенным проектом, ниже приведены технические сведения:

Встроенная ОС: Linux

Qt-версия: 5.3

ЖК-дисплей: 7 дюймов

Наконец, в системе работают две программы: одна — основной блок управления (с xenomai), использующий язык C, другая — Qt для графического интерфейса ЖК-дисплея. В программе Qt мне нужны два дополнительных потока: один для связи через сокет между Qt и основным блоком управления, другой поток используется для последовательного порта (у меня настроенная клавиатура с использованием RS232).

В нем будет около 10 окон, поэтому мне нужно переключать их одно за другим, на ЖК-дисплее одновременно отображается только одно. Qstackedwidget подходит для этого? И как управлять связью между окнами и основным приложением Qt? Я немного смущен всей архитектурой.

Нужно ли создавать эти 10 окон в самом начале?

Спасибо за поддержку.


person James.Zhou    schedule 15.09.2017    source источник
comment
В Qt все пользовательские интерфейсы находятся в основном потоке, вам нужно создавать классы Serial и TCP (с потоками) и использовать сигналы для связи с пользовательскими интерфейсами (Main Thread).   -  person Farhad    schedule 15.09.2017
comment
Для переключения окон: stackoverflow.com/a/45802206/5068056   -  person Farhad    schedule 15.09.2017
comment
Для переключения нескольких окон, во-первых: у меня гораздо больше, чем 2 окна, во-вторых: в каждом окне ему все еще нужно взаимодействовать с серийным номером и сокетом, похоже, что системе нужен другой класс для управления этими действиями.   -  person James.Zhou    schedule 15.09.2017
comment
НЕТ, вы можете создать класс TCP и move to thread его, тогда ваш класс станет вторым потоком, хотя пользовательский интерфейс класса TCP находится в основном потоке.   -  person Farhad    schedule 15.09.2017
comment
Старайтесь изо всех сил, чтобы логика, такая как последовательная связь и связь через сокеты, была отделена от вашего графического интерфейса. Вы можете использовать std::unique_ptr<QWidget> current_widget; в своем MainWindow, а затем выполнить current_widget = std::make_unique<SerialWindow>(this);, который должен избавиться от предыдущего окна и показать новое окно.   -  person nwp    schedule 15.09.2017
comment
Для переключения это легко, просто используйте сигналы для изменения, и приведенная выше ссылка очень хорошо объясняет это. ---- представьте, что каждый раз, когда вы получаете данные, которые вы хотите отобразить в пользовательском интерфейсе, вы должны подавать сигнал и обновлять пользовательский интерфейс. без прямого доступа к пользовательскому интерфейсу.   -  person Farhad    schedule 15.09.2017
comment
@nwp: спасибо за ответ. Это решение похоже на то, что сделал мой коллега, он делает 10 окон, наследуемых от класса base_window, который имеет несколько чисто виртуальных функций, вся логика осуществляется через объект current_window. Но я могу сказать, что это не способ Qt де-факто... Поэтому я пришел сюда, чтобы спросить.   -  person James.Zhou    schedule 15.09.2017