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
的格式。
我想在 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
的格式。