2014-01-23 264 views
0

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

回答

1

QLabel本身沒有辦法記住多個單一的值。

某些Qt類有一個數據字段,您可以在其中輸入任意數據(因此您可以附加一個QList),但QLabel不能。

您需要創建自己的實現,該實現源自QLabel

+0

好,我使用的textBrowser代替....謝謝 – CecchinoSMI

2

這似乎並沒有太大的意義,因爲:

  1. 一個QLabel是靜態的,用戶無法對其進行編輯。

  2. 我沒有看到使用可編輯控件會導致什麼「線程問題」。

既然您自己設置了標籤上的文字,那麼保留之前的郵件集合會出現什麼問題?如果你願意,顯示這種歷史的一個非常簡單的方法可以利用模型/視圖框架。下面的例子說明了它。要訪問歷史記錄,請右鍵單擊標籤。

screenshot

#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"