Привет переполнение.
Я пытаюсь добавить графический интерфейс в существующий проект. Точнее, для плагина, который загружается как файл .so
(или при компиляции на win32 .dll
)
Проект имеет собственную реализацию потоков, которая уже имеет дело с переносимостью. Я знаю, что в Qt есть своя собственная модель многоплатформенной многопоточности, но было бы предпочтительно остаться в рамках этой существующей модели многопоточности.
Мой вопрос к ветеранам Qt там [я только начал читать документы]: возможно ли встроить графический интерфейс с использованием Qt в плагин, как описано выше? Плагин уже является интерфейсом командной строки, и я хотел бы, чтобы GUI был необязательным, даже если он скомпилирован. Поскольку эти стандартные функции вызываются основной программой, графический интерфейс (который, как я предполагаю, будет жить в другом потоке) должен будет быть доступным или иметь возможность вызывать методы для него, чтобы поток CLI мог сосуществовать, а стандартные функции могли работать с любой перестановкой двух интерфейсов.
изменить 1:
немного поиграв с кодом, я могу запустить простой графический интерфейс из плагина. Плагин уже является CLI и имеет функции, которые вызываются из основной программы. Я просто создал новый поток при инициализации плагина и оттуда запустил блокирующий графический интерфейс:
QApplication app(NULL, NULL);
window = new zGui;
window->show();
app.exec();
Вопрос здесь такой: возможно ли обмениваться данными с графическим интерфейсом или, скорее, получать доступ к элементам графического интерфейса из потока CLI?
редактировать 2: некоторые результаты
Хорошо, пока запуск графического интерфейса блокировки в отдельном потоке работал без проблем. Я также могу получить доступ к виджетам в графическом интерфейсе из основного потока плагинов. Я понимаю, что эта практика не приветствуется, поскольку не только из-за ответов, которые я получил до сих пор, но также и библиотеки Qt выкладывают некоторые предупреждения о небезопасном доступе другим потоком.
На данный момент я работаю только в среде Linux, возможно, реальные проблемы будут представлены в других системах. Я видел только один глюк, который точно сказать не могу:
При изменении значений max и min виджета индикатора выполнения индикатор выполнения отображается пустым. Я смог применить простое исправление к этому следующим
//here is me setting the values
window->progressBar->setMaximum(character.maxHP);
window->progressBar_2->setMaximum(character.maxMP);
window->progressBar->setValue(character.curHP);
window->progressBar_2->setValue(character.curMP);
//and here is the fix
window->progressBar->setVisible(false);
window->progressBar->setVisible(true);
window->progressBar_2->setVisible(false);
window->progressBar_2->setVisible(true);
Полагаю, мой последний вопрос: «В каких конкретно ситуациях небезопасен доступ к графическому интерфейсу Qt из другого потока и почему?»