我想在QGraphicsTextItem上更改文本内容或更改字体或对齐时进行某些更新。
所以我将QTextDocument::contentsChanged()连接到执行更新的插槽。
只要文档内容发生变化,就会发出此信号;对于 例如,插入或删除文本时,或格式化时 应用
当我更改文本时,信号会被点击 - 但设置文本格式或对齐似乎不会影响它。
.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
)
但changing something
或setItemFont()
之后没有setItemAlign()
。
因此更改文本会影响它 - 但更改字体或对齐不会...
我是否理解错误在信号描述中设置粗体的部分?
更改字体或对齐后为什么看不到changing something
...
我也很奇怪 - 当我设置对齐或换行或其他文档属性影响连接时,我更改document()
吗? (似乎没有...)
(注意我写了setItem*
函数以便能够调用updateTextOnPropertyChanges()
函数 - 所以我可以按照我需要的方式工作 - 但如果我不需要它们会很棒只要使用Qt,如果信号按照我的想法工作就可以了)
答案 0 :(得分:0)
似乎松散地定义了格式下的内容。
正如您所说,setItemFont()
或setItemAlign()
不会触发信号,但在_document->setDocumentMargin(4.3);
方法中调用void MyTextItem::setItemAlign(Qt::Alignment a)
会发出信号。
此外,contentsChanged()
是QTextDocument
类发出的信号,因此我不确定调用QGraphicsTextItem
对象上的方法是否会改变其外观< / em>归类为修改QTextDocument
的格式。