Russian Qt Forum
Ноябрь 22, 2024, 20:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: CoInitializeEx и зависание getOpenDialog  (Прочитано 8182 раз)
nvek
Гость
« : Май 04, 2017, 12:13 »

Я не знаю к какому разделу эта тема относится, к гуи или сети.
в мейне:
Код:
::CoInitializeEx(0, COINIT_MULTITHREADED);
::CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);

QApplication a(argc, argv);
QCoreApplication::setApplicationName("");

MainForm mainWin;
mainWin.show();

int r = a.exec();
::CoUninitialize();
return r;

ну и где то по сигналу вызываю открытие документа уже в главной форме
Код:
void MainForm::open()
{
QString fileName = QFileDialog::getOpenFileName(this, Resource::OPEN_FILE, QDir::currentPath(), Resource::STATISTIC_SET);

if (fileName == NULL)
//////

на строчке где файлдиалог программа зависает как в дебаге, так и в релизе х64
закоментарив инициилизацию кома все нормально.. так же как и заменить первую строчку на
Код:
::CoInitializeEx(0, COINIT_APARTMENTTHREADED);
тоже все нормально...
странно

Записан
mitrich
Гость
« Ответ #1 : Май 04, 2017, 13:00 »

На форумах пишут, что функция GetOpenFileName (которая показывает нативный файловый диалог) работает только в single-threaded apartment: https://social.msdn.microsoft.com/Forums/vstudio/en-US/366373e9-9216-4a80-b4d5-25da059d4a33/getopenfilename-fails-on-windows-7-2008-using-visual-studio-2010?forum=vcgeneral
В оф. документации про это ничего не нашёл.
Можно попробовать либо использовать ненативный диалог (dlg.setOptions(DontUseNativeDialog)), либо обрамлять вызовы диалога так (понятия не имею, будет ли это работать):
Код
C++ (Qt)
CoUninitialize()
CoInitializeEx(0, COINIT_APARTMENTTHREADED);
QString fileName = QFileDialog::getOpenFileName(this, Resource::OPEN_FILE, QDir::currentPath(), Resource::STATISTIC_SET);
CoUninitialize();
CoInitializeEx(0, COINIT_MULTITHREADED);
 
Записан
nvek
Гость
« Ответ #2 : Май 04, 2017, 14:26 »

Проверил, действительно не нативный диалог работает, но там по умолчанию все на английском, а это не устраивает
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Май 04, 2017, 15:19 »

файл локализации qt_ru.qm надо подключить
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
mitrich
Гость
« Ответ #4 : Май 04, 2017, 15:29 »

В методе main():
Код
C++ (Qt)
QTranslator qtTrans;
 
//загружаем из места где установлен Qt
if(qtTrans.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
//или из ресурсов
//if(qtTrans.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLatin1String(":/translations")))
   app.installTranslator(&qtTrans);
 
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Май 04, 2017, 19:20 »

народ, вы ещё на Qt4 пишите? Улыбающийся В Qt5 надо грузить qt_ru.qm (он почти пустой, к слову) и qtbase_ru.qm.
Записан
mitrich
Гость
« Ответ #6 : Май 04, 2017, 23:58 »

Он и есть пустой. Данных не содержит, а содержит ссылки на другие каталоги, которые и будут загружены.
Код
XML
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru">
<dependencies>
<dependency catalog="qtbase_ru"/>
<dependency catalog="qtscript_ru"/>
<dependency catalog="qtquick1_ru"/>
<dependency catalog="qtmultimedia_ru"/>
<dependency catalog="qtxmlpatterns_ru"/>
</dependencies>
</TS>
 
Записан
nvek
Гость
« Ответ #7 : Июль 10, 2017, 15:41 »

возвращаюсь к моей старой теме, ибо очень интересует этот вопрос
сделав тестовый проест, который делает почти все тоже что и мой до открытия диалога
долго думав, я так ничего не понял.
Поставил в конструктор мейнформ, тесть поставил инициилизацию кома после того как инициилизируется qt все заработало!
ура!

но... в тестовом проекте ком инициилизируется раньше qt
в чем логика??? Непонимающий Непонимающий Непонимающий Непонимающий
было:
Код:
int main(int argc, char *argv[])
{
::CoInitializeEx(0, COINIT_MULTITHREADED);
::CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);

QApplication a(argc, argv);
        ////////
стало

Код:
MainForm::MainForm() :
 . . .
{
::CoInitializeEx(0, COINIT_MULTITHREADED);
::CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);

      ///////////////


(╯°□°)╯︵ ┻━┻
« Последнее редактирование: Июль 11, 2017, 07:21 от nvek » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 23.