我的问题很简单,很简短。 我不知道是否有可能保留我在标签中设置的文本消息的历史记录,换句话说,我想用它作为一个文本编辑器,但在这种情况下,我没有线程问题。保存QLabel的历史记录
0
A
回答
1
QLabel
本身没有办法记住多个单一的值。
某些Qt类有一个数据字段,您可以在其中输入任意数据(因此您可以附加一个QList
),但QLabel
不能。
您需要创建自己的实现,该实现源自QLabel
。
2
这似乎并没有太大的意义,因为:
一个
QLabel
是静态的,用户无法对其进行编辑。我没有看到使用可编辑控件会导致什么“线程问题”。
既然您自己设置了标签上的文字,那么保留之前的邮件集合会出现什么问题?如果你愿意,显示这种历史的一个非常简单的方法可以利用模型/视图框架。下面的例子说明了它。要访问历史记录,请右键单击标签。
#include <QLabel>
#include <QStringList>
#include <QListView>
#include <QStringListModel>
#include <QAction>
class LabelWithHistory : public QLabel {
Q_OBJECT
Q_PROPERTY(QString text READ text WRITE setText)
QStringList m_history;
QStringListModel* m_model;
QListView* m_view;
void init() {
QAction * showHistory = new QAction("History", this);
connect(showHistory, SIGNAL(triggered()), SLOT(showHistory()));
addAction(showHistory);
setContextMenuPolicy(Qt::ActionsContextMenu);
}
void initView() {
m_model = new QStringListModel(this);
m_view = new QListView(this);
m_view->setWindowFlags(Qt::Window);
m_view->setModel(m_model);
m_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_view->setSelectionMode(QAbstractItemView::NoSelection);
m_view->setWordWrap(true);
m_view->setAlternatingRowColors(true);
}
Q_SLOT void showHistory() {
if (! m_view) initView();
if (m_view->isVisible()) return;
m_model->setStringList(m_history);
m_view->move(mapToGlobal(QPoint(0, height())));
QModelIndex lastRow(m_model->index(m_history.size()-1));
int bottomY = m_view->visualRect(lastRow).bottom();
int widthHint = m_view->sizeHint().width();
if (bottomY < m_view->sizeHint().height())
m_view->resize(widthHint, bottomY + 1);
m_view->show();
}
void hideEvent(QHideEvent *) {
if (m_view) m_view->hide();
}
public:
LabelWithHistory(QWidget * parent = 0, Qt::WindowFlags f = 0) :
QLabel(parent,f), m_model(0), m_view(0) { init(); }
LabelWithHistory(const QString & text, QWidget * parent = 0, Qt::WindowFlags f = 0) :
QLabel(text, parent, f), m_model(0), m_view(0) { init(); }
Q_SLOT void setText(const QString & text) {
if (text == this->text()) return;
m_history.prepend(text);
if (m_view && m_view->isVisible())
m_model->setStringList(m_history);
QLabel::setText(text);
}
};
#include <QApplication>
#include <QHBoxLayout>
#include <QPushButton>
int main(int argc, char ** argv)
{
auto items = QStringList() << "Foo" << "Bar" << "Baz" << "Ban";
QApplication a(argc, argv);
QWidget w;
QHBoxLayout layout(&w);
LabelWithHistory label;
QPushButton button("Add Item");
QObject::connect(&button, &QPushButton::clicked, [&label, &items](){
label.setText(items[qrand() % items.size()]);
});
layout.addWidget(&label);
layout.addWidget(&button);
for (auto item : items) label.setText(item);
w.setMinimumSize(200, 50);
w.show();
return a.exec();
}
#include "main.moc"
相关问题
- 1. 保存Zsh的历史记录〜/ .persistent_history
- 2. 保持历史记录与WKWebView缓存
- 3. 在git中保存历史记录
- 4. 在iPhone中保存历史记录
- 5. 如何保存IEx历史记录?
- 6. 使用clearcase保存历史记录
- 7. 保存项目历史记录
- 8. MS Word保存历史记录
- 9. 组合2个git存储库,保留文件历史记录,不保存提交历史记录
- 10. GWT历史记录:历史记号
- 11. 保留旧页面的历史记录
- 12. MATLAB命令历史记录:如何保存备份的现有历史
- 13. 保存目录zshell的特定历史记录
- 14. 如何在SQL Server中的历史记录表中存储历史记录
- 15. 通过标记组合git repos保存历史记录
- 16. 如何在保存后保持VS更改历史记录?
- 17. LDAP登录历史记录
- 18. 贝宝Sandbox历史记录重定向到REAL历史记录
- 19. javascript保存历史
- 20. 历史未保存
- 21. 保存和管理数据的历史记录
- 22. 在浏览器的历史记录上保存了Ajax请求
- 23. 保存按钮id的历史记录使用android
- 24. Iterm2保存命令历史记录中的SSH会话
- 25. 保存WF状态机状态转换的历史记录
- 26. 目标C保存项目的历史记录
- 27. 从命令提示符保存结果的历史记录?
- 28. 如何保存来自Rstudio历史记录的所有图形
- 29. 保存所有浏览器网址的历史记录
- 30. 更改PHP交互式shell历史记录的保存路径
好,我使用的textBrowser代替....谢谢 – CecchinoSMI