自动更新QLabel文本

4

我有一个简单的Qt应用程序,其中包含一个QLabel。我想知道是否有可能自动更新其文本内容,因为QLabel的构造函数使用了引用。

QLabel ( const QString & text, QWidget * parent = 0, Qt::WindowFlags f = 0 )

我希望的是一个QLabel,当我改变QString的内容时,它的文本会被更新。

我尝试了以下代码(使用Qt 5.0.2):

#include <QtGui>
#include <QtWidgets>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QString str("test");
    QLabel label(str);
    label.setFixedSize(300,70);
    label.show();
    str = "yoh";
    label.repaint();

    return app.exec();
}

但是标签仍然显示“test”。所以,我做错了什么,或者自动更新内容不可能?如有帮助,将不胜感激。顺便说一句,如果需要子类化QLabel,那也没有问题。
2个回答

9
实际上你可以做到。你需要创建模型。
QLabel label;
label.show();

QStandardItemModel *model = new QStandardItemModel(1,1);
QStandardItem *item1 = new QStandardItem(QStringLiteral("test"));
model->setItem(0, 0, item1);

使用 QDataWidgetMapper,为一个 QLabel 和模型中的一个部分添加映射。
QDataWidgetMapper *mapper = new QDataWidgetMapper();
mapper->setModel(model);
mapper->addMapping(&label,0,"text");
mapper->toFirst();

每次模型更改时,QLabel 将使用来自模型的数据进行更新。
model->setData(model->index(0,0),"yoh");

我会考虑使用一个模型(之前不知道QDataWidgetMapper),谢谢 ;) - lephe
这就是为什么我提到了观察者模式,它实现了MVC模式和您的模型连接。 - Victor Polevoy
1
由于存在开放的错误 https://bugreports.qt.io/browse/QTBUG-10672,因此在`addMapping`的第三个参数中,“text”属性是必需的。如果没有它,则无法将映射到“QLabel”。如果您映射到“QLineEdit”,则不需要它。 - Lucas
@Lucas 我们在哪里可以找到这些属性名称?它具体是什么? - Zhang LongQI
1
@张龙琦 属性是QObject类的一个特性,它们的行为类似于类数据成员,但具有通过元对象系统访问的其他功能,例如指定getter或setter。例如,QComboBox具有currentIndex,QLabel具有text,而QLineEdit具有selectedText - Lucas

0

你不能这么做。QtCore 库在 C++ 代码中没有提供绑定表达式,但是 qt 在 QtQml 库中特别为了简化 UI 设计而提供了。如果你谈论的是引用,则你正在错误地使用它,或多或少,这是不可能的。要自动更新你的代码,应该实现一个 subscriberobserver 软件设计模式,并且你的 QLabel 必须使用它。C++ 并不像你想象的那么简单。

如果你真的需要一个自动更新的 GUI,请尝试使用 QML


这就是为什么我更喜欢指针... :/ 无论如何,感谢您的解释。 - lephe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接