Добавление графического интерфейса Qt в динамическую библиотеку - PullRequest
2 голосов
/ 26 июня 2009

Привет переполнение. Я пытаюсь добавить графический интерфейс в существующий проект. Точнее, для плагина, который загружается как файл .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 из другого потока и почему?»

Ответы [ 2 ]

5 голосов
/ 26 июня 2009

Вы можете использовать графический интерфейс Qt из dll или около того, который вызывается из приложения не из Qt, но он не может быть из вторичного потока, он должен выполняться в основном потоке. И цикл событий приложения запускается с помощью метода блокировки, который возвращается при закрытии GUI, поэтому, если вам нужно, чтобы в вашем приложении работала логика, независимая от GUI, тогда эта логика должна была бы выполняться во вторичном потоке. .

Если вы чувствуете себя честолюбивым, вы можете изменить классы QCoreApplication и QEventLoop таким образом, чтобы вы могли управлять циклом обработки событий из вызывающего приложения, и это, вероятно, не будет таким уж сложным. Но, насколько я знаю, нет способа сделать это с помощью Qt из коробки.

3 голосов
/ 26 июня 2009

Учитывая ответ Джеральда, могу ли я предположить, что лучше держать CLI (ваше приложение) отдельно от GUI вашего приложения (т.е. отдельное приложение).

Заставьте ваше приложение с графическим интерфейсом использовать cli на заднем плане. это легко сделать с помощью QProcess.

ура! * * 1005

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...