格式更改似乎没有触发QTextDocument :: contentsChanged

时间:2015-08-20 21:32:48

标签: qt signals qgraphicsitem

我想在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 somethingsetItemFont()之后没有setItemAlign()

因此更改文本会影响它 - 但更改字体或对齐不会...

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

我也很奇怪 - 当我设置对齐或换行或其他文档属性影响连接时,我更改document()吗? (似乎没有...)

(注意我写了setItem*函数以便能够调用updateTextOnPropertyChanges()函数 - 所以我可以按照我需要的方式工作 - 但如果我不需要它们会很棒只要使用Qt,如果信号按照我的想法工作就可以了)

1 个答案:

答案 0 :(得分:0)

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

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

此外,contentsChanged()QTextDocument类发出的信号,因此我不确定调用QGraphicsTextItem对象上的方法是否会改变其外观< / em>归类为修改QTextDocument格式