QTextDocument::contentsChanged 似乎不会在格式更改时触发

QTextDocument::contentsChanged doesn't seem to be triggered on formatting changes

我想在 QGraphicsTextItem 上的文本内容更改或字体或对齐方式更改时进行某些更新。

所以我将 QTextDocument::contentsChanged() 连接到一个进行更新的插槽。

This signal is emitted whenever the document's content changes; for example, when text is inserted or deleted, or when formatting is applied.

当我更改文本时出现信号 - 但设置文本格式或对齐方式似乎不会影响它。

.h
class MyTextItem : public QGraphicsTextItem
{
Q_OBJECT
public:
    MyTextItem();
    ~MyTextItem() {}
    void setItemFont(QFont f);
    void setItemAlign(Qt::Alignment a);
private slots:
    void updateItemOnContentsChanged();
private:
    void updateTextOnPropertyChanges();
};

.cpp
MyTextItem::MyTextItem()
{
    setTextInteractionFlags(Qt::TextEditorInteraction);
    connect(document(), SIGNAL(contentsChanged()), this, SLOT(updateItemOnContentsChanged()));
}
void MyTextItem::setItemFont(QFont f)
{
    setFont(f);
}
void MyTextItem::setItemAlign(Qt::Alignment a)
{
    QTextDocument *_document = document();
    QTextOption _option = _document->defaultTextOption();
    _option.setAlignment(a);
    _document->setDefaultTextOption(_option);
    setDocument(_document);
}
void MyTextItem::updateItemOnContentsChanged()
{
    updateTextOnPropertyChanges();
}
void MyTextItem::updateTextOnPropertyChanges()
{
    qDebug("changing something");
}

main.cpp
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QGraphicsScene s;
    QGraphicsView view(&s);
    s.setSceneRect(-50, -50, 500, 500);
    view.show();
    MyTextItem* t = new MyTextItem();
    t->setPlainText("Hello World !");   // Note this triggers update
    s.addItem(t);
    qDebug("1");
    qDebug() << t->font().family();
    t->setItemFont(QFont("Arial"));  // or t->setFont(QFont("Arial"));
    qDebug() << t->font().family();
    qDebug("2");
    t->setItemAlign(Qt::AlignRight);
    qDebug("3");
    return app.exec();
}

我的调试输出:

changing something
1
"MS Shell Dlg 2" // so the font is changing - yet no signal
"Arial"
2
3

(如果我在场景中输入项目,我也会得到 changing something
但是 setItemFont()setItemAlign() 之后没有 changing something

所以更改文本会影响它 - 但更改字体或对齐方式不会...

我在信号描述中加粗的部分理解错了吗?
为什么我在更改字体或对齐后看不到 changing something...

我也想知道 - 当我设置对齐或换行或其他文档属性时更改 document() 会影响连接吗? (好像没有……)

(请注意,我编写了 setItem* 函数以便能够调用 updateTextOnPropertyChanges() 函数 - 这样我就可以按照我需要的方式进行操作 - 但如果我不需要,那就太好了他们,只要使用 Qt 的,如果信号像我想象的那样工作)

格式化 下的内容似乎定义松散。

如您所说,setItemFont()setItemAlign() 不会触发信号,但在您的 void MyTextItem::setItemAlign(Qt::Alignment a) 方法中调用 _document->setDocumentMargin(4.3); 会。

此外,contentsChanged() 是由 QTextDocument class 发出的信号,因此我不确定是否在 QGraphicsTextItem 对象上调用方法来更改其 外观 class修改QTextDocument格式