2015-09-28 5 views
1

У меня есть богатые текстовые элементы, реализованные с использованием QGraphicsTextItemЧтение Rich Text Character и блок форматирования

Чтобы установить размер шрифта, например:

void set (int fontSize) { 
    QTextCursor _cursor = textCursor(); 
    QTextCharFormat _format; 
    _format.setFontPointSize(fontSize); 
    _cursor.mergeCharFormat(_format); 
    setTextCursor(_cursor); } 

намного сложнее, чтобы прочитать размер шрифта.
Предполагая, что у меня есть выбор, я должен перебрать документ, через все QTextBlock, QTextFragment, чтение QTextCharFormat ...
Но простой вариант, если нет выбора, просто читать размер шрифта под курсором:

int get() { 
    return textCursor().charFormat().fontPointSize(); } 

Это работает, но я нашел 3 вопроса:

1) Настройка размера шрифта по QGraphicsTextItem свойствами:

QFont f = font(); 
f.setPointSize(20); 
setFont(f); 

это возвращает 0 моей функцией get выше. Чтобы установить размер шрифта для всего элемента, я должен использовать тот же метод, что и в функции set.
Не должен ли метод setFont установить шрифт, который можно прочитать с QTextCursor?

2) setHtml можно установить форматирование - но я не вижу какой-либо способ, чтобы прочитать, что при форматировании
Как я могу читать форматированный текст форматирования из фрагмента HTML? Является единственной позитивностью, анализируя html?

3) (мой текущий блок Камня)
Копировать форматированный текст из внешнего источника и вставить в QGraphicsTextItem, кажется, сохранить форматирование источника - но как я могу прочитать, что при форматировании?
Метод get выше читает размер шрифта 0, если текст был вставлен снаружи.
font().pointSize() всегда возвращает 8. (Я не задал его, так что я думаю, что это значение по умолчанию)
Есть ли другой способ для чтения текстового формата?
- это текст буфера обмена, отформатированный с использованием html?

Как найти размер шрифта (или любого другого форматирования) из вложенного текста?

(Эти же вопросы относятся к форматированию блоков, например выравниванию).

ответ

1

Я думаю, что большинство ваших проблем можно решить, получив QTextDocument для вашего объекта QGraphicsTextItem и работа с ним. QTextDocument и его методы (например, QTextFormat::property(int propertyId)) могут помочь вам получить много properties для вашего текста.

1) Если вы установили размер с помощью объекта QFont, вы должны получить размер, используя тот же путь.

2) Когда вы устанавливаете текст с помощью html, QGraphicsTextItem::font() не подходит, поэтому вам нужно получить QTextDocument и использовать их функции вместо этого.

3) То же, что и 2. Я думаю ...потому что у меня нет кода для его проверки :)

Ну, здесь у вас есть код в качестве примера. Надеюсь, этот ответ поможет вам.

#include <QApplication> 
#include <QGraphicsScene> 
#include <QGraphicsView> 
#include <QGraphicsTextItem> 
#include <QTextCursor> 
#include <QTextCharFormat> 
#include <QFont> 
#include <QDebug> 
#include <QTextDocument> 
#include <QTextBlock> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QGraphicsScene scene; 
    QGraphicsView view(&scene); 

    /* ITEM 1 */ 
    QGraphicsTextItem* item_1 = new QGraphicsTextItem("QGraphicsTextItem 1"); 
    item_1->setTextInteractionFlags(Qt::TextEditorInteraction); 
    QFont f = item_1->font(); 
    f.setPointSize(30); 
    item_1->setFont(f); 

    qDebug() << "textCursor().position() (returns 0): " << 
       item_1->textCursor().position(); 
    qDebug() << "textCursor().charFormat().fontPointSize() (returns 0): " << 
       item_1->textCursor().charFormat().fontPointSize(); 
    qDebug() << "font().pointSize() (returns 30 - OK!): " << 
       item_1->font().pointSize(); 

    QTextDocument* doc = item_1->document(); 
    f = doc->defaultFont(); 
    qDebug() << "pointSize (returns 30 - OK!): " << f.pointSize(); 

    scene.addItem(item_1); 

    /* ITEM 2 */ 
    QGraphicsTextItem* item_2 = new QGraphicsTextItem(); 
    item_2->setPos(0, 50); 
    item_2->setHtml("<html><head/><body><p>" 
        "<span style=\"font-size:14pt; font-weight:600;\">QGraphics</span>" 
        "<span style=\"font-size:24pt; font-weight:600;\">TextItem 2</span>" 
        "</p></body></html>"); 

    qDebug() << "font().pointSize() (returns 8, the default value): " 
      << item_2->font().pointSize(); 

    doc = item_2->document(); 
    f = doc->defaultFont(); 
    qDebug() << "pointSize (returns 8, the default value): " << f.pointSize(); 

    QVector<QTextFormat> formats = doc->allFormats(); 
    QVectorIterator<QTextFormat> i(formats); 
    while (i.hasNext()) { 
     QTextFormat format = i.next(); 
     if (format.property(QTextFormat::FontPointSize).isValid()) 
      qDebug() << "format.property (returns 14 or 24): " << 
         format.property(QTextFormat::FontPointSize).toInt(); 
    } 

    /* 
    * Get the block of text. In this example, we only have one block, but 
    * two text fragments (see below) 
    */ 
    QTextBlock text_block = item_2->document()->findBlock(1); 
    QTextBlock::iterator it; 

    for (it = text_block.begin(); !(it.atEnd()); ++it) { 
     QTextFragment currentFragment = it.fragment(); 
     if (currentFragment.isValid()) 
      qDebug() << "currentFragment.text(): " << currentFragment.text(); 
      qDebug() << "currentFragment.charFormat().font().pointSize() " 
         "(returns 14 or 24, depending on" 
         "the current text fragment): " << 
         currentFragment.charFormat().font().pointSize(); 
    } 

    scene.addItem(item_2); 

    view.setFixedSize(640, 480); 
    view.show(); 
    return a.exec(); 
} 
+0

Спасибо за пример, поэтому в основном это невозможно реализовать форматированный текст с взаимодействием с пользователем - с помощью позиции курсора, выбор и так далее - с каким-либо HTML или любым входным буфером обмена, то есть то, что я понимаю. Поскольку это то, что мне нужно сделать: реализовать расширенное редактирование текста, единственный способ отключить любое форматирование html и разрешить простое вложение текста. Это правда ? Или я понимаю ваш ответ неправильно? – Thalia

+0

Мой код ... является гигантским ... но я вставил соответствующие функции, чтобы установить размер шрифта (в точке курсора, чтобы новый текст имел размер шрифта) или для выделенного фрагмента текста, а также чтобы получить шрифт в курсора. – Thalia

+0

Ваш код отвечает на мой вопрос (2), а также подтверждает мое утверждение из (1) - за исключением того, что, как представляется, существует только способ получить все форматы во всем документе. Невозможно получить его в определенной точке (например, в позиции) или для определенного диапазона (выбор - от позиции a до позиции b). – Thalia