Развернутое приложение Qt5 не печатает или не показывает диалоговое окно печати

У меня проблемы с Qt4-Qt5. В моем приложении, когда пользователь нажимает кнопку печати, должны произойти две вещи: во-первых, PDF-файл записывается на диск (который по-прежнему отлично работает в новой версии, поэтому я знаю, что некоторые функции печати работают правильно), а во-вторых заключается в том, что QPrintDialog должен выполнить exec(), а затем отправить на подключенный принтер.

Я вижу диалоговое окно при запуске с моей машины разработки. Приложение запускается на развернутом компьютере, но QPrintDialog никогда не отображается, и документ никогда не печатается.

Я включаю поддержку печати.

QT += core gui network webkitwidgets widgets printsupport

Я использовал Process Explorer, чтобы увидеть, какие библиотеки DLL использует приложение на моем компьютере для разработки, и я считаю, что все присутствует. В комплект моего приложения входят:

  • {myAppPath}\MyApp[MyApp.exe, Qt5PrintSupport.dll, ...]
  • {myAppPath}\plugins\printsupport\windowsprintersupport.dll
  • {myAppPath}\plugins\imageformats[qgif.dll, qico.dll,qjpeg.dll, qmng.dll, qtga.dll, qtiff.dll, qwbmp.dll]

Ниже приведен соответствующий фрагмент кода:

void PrintableForm::printFile()
{
    //Writes the PDF to disk in every environment
    pdfCopy();

    //Paper Copy only works on my dev machine
    QPrinter paperPrinter;
    QPrintDialog printDialog(&paperPrinter,this);

    if( printDialog.exec() == QDialog::Accepted ) {
        view->print(&paperPrinter);
    }
    this->accept();
}

Моя первая мысль заключается в том, что соответствующие библиотеки DLL не обнаруживаются во время печати, а это означает, что файловая система моего приложения неверна, но я не нашел ничего, что указывало бы мне на другую файловую структуру. Я на правильном пути или что-то еще не так с этой настройкой?


person RegularlyScheduledProgramming    schedule 18.06.2013    source источник
comment
Вы уверены насчет {myAppPath}\plugins\printsupport\windowsprintersupport.dll? Должно быть без части плагинов. Установите для переменной env QT_DEBUG_PLUGINS ненулевое значение и запустите приложение из консоли, чтобы убедиться, что плагин действительно найден и используется.   -  person peppe    schedule 19.06.2013
comment
Прогресс. peppe, хороший совет по перемещению printsupport* назад на одну директорию. Теперь он дает мне диалог печати (Qt должен использовать для этого собственный диалог, а не эмулировать его), но когда я нажимаю печать, ничего не происходит. Я попытался установить переменную окружения и запустить через командную строку, но ничего не получил. Я так понимаю, что этот шаг нужно делать с машины разработки, а не с машины развертывания?   -  person RegularlyScheduledProgramming    schedule 21.06.2013
comment
Чтобы QT_DEPLOY_PLUGINS выдавал что-то полезное, нужно было добавить CONFIG += CONSOLE в .pro файл   -  person RegularlyScheduledProgramming    schedule 03.07.2013


Ответы (1)


Это была еще одна классическая проблема развертывания Windows/Qt5 с комбинацией отсутствующих подключаемых модулей и подключаемых модулей, размещенных в неправильных местах. Используя переменную окружения QT_DEBUG_PLUGIN и добавив CONFIG += CONSOLE в мой файл PRO, я смог увидеть, что на моем компьютере для разработки приложение загружало qminimal.dll, который я не отправлял.

Корень приложения, который я определил как {myAppPath}\, является корневым каталогом для плагинов. Поэтому правильная структура файла:

  • {myAppPath}\MyApp[MyApp.exe, Qt5PrintSupport.dll, ...]
  • {myAppPath}\платформы[qwindows.dll,qminimal.dll]
  • {myAppPath}\printsupport*
  • {myAppPath}\форматы изображений*
  • {myAppPath}\носитель*

Спасибо, Пеппе, за наводку.

person RegularlyScheduledProgramming    schedule 03.07.2013