2015-09-28 33 views
1

我使用QGraphicsTextItem阅读格式文本字符和块格式

设置字体大小实现富文本项目,例如:

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

很多更复杂的是阅读的字体大小。
假设我有一个选择,我必须通过文件迭代,经过全体QTextBlockQTextFragment,读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片段格式?是唯一的posiblity,解析html?

3)(我目前的绊脚石)
复制格式从外部源文本,并在QGraphicsTextItem粘贴似乎保持源的格式 - 但我怎么可以读取的格式?
上述get方法读取的字体大小0,如果文本是从外面粘贴。
font().pointSize()总是返回8.(我没有设置它,所以我想这是一个默认设置)
是否有另一种方法来阅读文本格式?
是使用html格式化的剪贴板文本吗?

我怎样才能找到所粘贴的文本字体大小(或任何其他格式)?

(同样的问题适用于块格式化,像对准)。

回答

1

我认为你的大部分问题都可以通过为你的QGraphicsTextItem对象获取QTextDocument来解决,并且可以使用它。 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