Всё, разобрался. Значения необязательных параметров нужно передавать в вызов dynamicCall() в виде невалидных вариантов QVariant(). Есть только одна тонкость - нельзя пользоваться методом dynamicCall() принимающим параметры по одному через запятую, т.к. если метод встречает невалидный вариант, он считает, что предыдущий параметр был последним и список параметров будет неполным. Нужно пользоваться методом dynamicCall(), принимающим аргументы в виде списка. Вот как то так:
QVariantList printParameters = QVariantList() << QVariant(1) << QVariant() << QVariant(1) << QVariant(false) << QVariant(printerName) << QVariant(false) << QVariant(false);
bool printSuccessed = document->dynamicCall("PrintOut(From:=const QVariant&, To:=const QVariant&, Copies:=const QVariant&, Preview:=const QVariant&, ActivePrinter:=const QVariant&, PrintToFile:=const QVariant&, Collate:=const QVariant&)", printParameters).toBool();