我的問題很簡單,很簡短。 我不知道是否有可能保留我在標籤中設置的文本消息的歷史記錄,換句話說,我想用它作爲一個文本編輯器,但在這種情況下,我沒有線程問題。保存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