Я генерирую документ Word через Qt's Active Qt
модуль.
Я могу написать документ, указать «стиль» для этого текста (жирный, курсив, выравнивание и т. Д.) И запросить различные его части.
Прямо сейчас я пытаюсь отобразить картинку и расположить ее прямо в центре страницы.
Для вставки картинки:
QAxObject word( "Word.Application" );
QAxObject* activeDocument = word.querySubObject("ActiveDocument");
QAxObject* activeWindow = activeDocument->querySubObject( "ActiveWindow" );
QAxObject* selection = activeWindow->querySubObject( "Selection" );
selection->dynamicCall( "Collapse(int)", 0 );
const int pos = selection->dynamicCall( "End" ).toInt();
QAxObject* shapes = activeDocument->querySubObject( "Shapes" );
QAxObject* shape = shapes->dynamicCall( "AddPicture(QString,bool,bool,float,float,float,float)",
picPath,
true, true );
Это вставляет картинку в левой части страницы. В Word
Я могу вставить изображение, выбрать его и указать его выравнивание (по центру, в моем случае), но я не могу сделать это с помощью кода.
Я попытался установить привязку картинки к центру, но она все еще появляется в левой части страницы:
shape->querySubObject( "Anchor" )->querySubObject( "ParagraphFormat" )->setProperty( "Alignment", 1); // 1 == wdAlignParagraphCenter
а также:
shape->querySubObject( "Anchor" )->dynamicCall("InsertAlignmentTab(int)",1); // 1 == center
Также обратите внимание, что когда я открываю созданный документ со вставленными изображениями, если я выбираю одно из изображений, Я не могу это отцентрировать; тогда как используя Вставить В меню я могу выбрать картинку и отцентрировать ее.
Есть ли способ центрировать любую картинку, в которую я вставляю Word
?
Когда вы вставляете изображение в Word, оно может всплывать над текстом или находиться в абзаце. (Обтекание текстом)
Вы должны проверить, было ли изображение вставлено в абзац или выше.
*Select Image -> Formatting -> Wrap Text*
Мне кажется, что вы установили стиль для выравнивания абзаца, но изображение плавает над текстом.
Я нашел способ центрировать изображение в вопросе.
QAxObject* shapes = selection->querySubObject( "InlineShapes" );
QAxObject* inlineShape = shapes->querySubObject(
"AddPicture(const QString&,bool,bool,QVariant)",
picPath, false, true )
;
inlineShape->dynamicCall( "ScaleHeight", height );
inlineShape->dynamicCall( "ScaleWidth", width );
selection->querySubObject( "ParagraphFormat" )->setProperty( "Alignment", 1 );
QAxObject* range = shape->querySubObject( "Range" );
const int start = range->property( "Start" ).toInt();
const int end = range->property( "End" ).toInt();
selection->dynamicCall( "SetRange(int,int)", start, end );
selection->dynamicCall( "Collapse(int)", 0 );
selection->querySubObject( "ParagraphFormat" )->setProperty( "Alignment", 3 );
Вместо того, чтобы запрашивать Shapes
объект, я теперь запрашиваю InlineShapes
один. Это важно, так как теперь я могу использовать объект выделения (который теперь указывает на положение вставленного изображения) и указать его выравнивание через ParagraphFormat
субобъект.
После этого я обновляю выделение картинкой Range
чтобы начать печатать после рис. и установить выравнивание обратно на выравнивание.