статические диалоговые окна qt невозможны? - PullRequest
0 голосов
/ 27 февраля 2012

кажется, что всякий раз, когда я пытаюсь "сохранить" диалоговое окно qt в статической переменной, происходит сбой программы. (С ошибкой отладки, сообщающей, что QPaintDevice не может быть создан до QMainApplication).

Поскольку эта ошибка произошла до того, как был введен основной цикл, я понял, что проблема заключалась в статических переменных. (Ну, и это было единственное, что я добавил со времени последней сборки).

Позвольте мне сначала попытаться объяснить, как я его использую. В основном у меня есть дерево (происхождение от некоторых внешних -xml- файлов). Я хочу отобразить данные из этого дерева. Однако в зависимости от фактического места в дереве данные должны отображаться по-разному. (Использование совершенно разных диалогов).

Итак, я начал создавать статическую карту. Эта карта содержит в качестве ключа дерево «location» («regexified» к чему-то вроде «a * c d» - пробелы обозначают разветвление). И в качестве значения следует указать правильный диалог.

Первой идеей было просто использовать указатели на диалоговые окна. (И тогда функция, которая ищет переменную, просто выполняет диалоговое окно). Однако это привело к ошибке, показанной выше.

Теперь я начал использовать промежуточную прокси-функцию, где функция просто создает диалоговое окно и вызывает его. И статическая карта просто содержит указатель на эту функцию. Что-то вроде:

int AskGUIFn::GenStd(const GMProject::pTree& tOut, const GMProject::pTree& tIn) const {
    std::unique_ptr<MW::GenStd> box(new MW::GenStd(&tOut, &tIn));
    return box->exec();
}

Однако это кажется очень многословным (мне нужно не только создать все модальные окна, но и добавить еще одну прокси-функцию для каждого диалогового экрана). Есть ли более чистый способ сделать это? Я хотел бы запретить использование прокси-функций?

1 Ответ

3 голосов
/ 27 февраля 2012

Статические QWidgets невозможны - объект QApplication должен быть создан до QWidget. Кроме того, неопределенный порядок инициализации и уничтожения статических переменных может вызвать проблемы. Также обратите внимание, что вы всегда должны передавать родительский элемент в модальное диалоговое окно в случае, если у вас есть другие видимые окна (например, главное окно), в противном случае наложение окон будет показывать раздражающее поведение на некоторых платформах (модальные диалоги за отключенными окнами и т. Д.). Как и кенрогеры, я бы предложил использовать заводскую функцию, например:

QDialog* createDialogForNodeType( const QString& type, ...tree data, QWidget* parent );
...