보기 위젯을 재정의 할 필요가 없습니다. Qt는 모델의 항목에 대한 상태 정보를 보여주기위한 내장 지원을 제공합니다.
일반적으로는, 당신은에서 QString
을 반환해야 모델의 data()
role
이 QStatusTipRole
, 당신이 당신의 품목을 가져 때 QString
상태 표시 줄에 표시됩니다 때.
QTableView
의 경우 mouse tracking을 켜야 마우스 단추를 누르지 않고 상태 표시 줄을 업데이트 할 수 있습니다. 이는 마우스 추적이 사용되지 않으면 (기본적으로) 위젯이 마우스 버튼을 누르고있는 동안에 만 마우스 이동 이벤트를 수신하기 때문입니다.
자, 대신 기본 상태 표시 줄의 당신의 QLineEdit
에서 그 상태 도움말을 표시하기 위해, 당신은 당신의 QLineEdit
에 메인 윈도우의 event
기능, 차단 QStatusTipEvent
들, 그리고 쇼 팁을 대체 할 수 있습니다. 여기
이 예제 구현 : // 문서 : 당신이 QStatusBar은 마우스 클릭에 업데이트 할 가정
![screenshot](https://i.stack.imgur.com/9bWgA.png)
#include <QtWidgets>
//model to provide dummy data
class MyModel : public QAbstractTableModel{
public:
explicit MyModel(QObject* parent= nullptr):QAbstractTableModel(parent){}
~MyModel() = default;
int columnCount(const QModelIndex &parent) const{
if(parent.isValid()) return 0;
return 4;
}
int rowCount(const QModelIndex &parent) const{
if(parent.isValid()) return 0;
return 20;
}
QVariant data(const QModelIndex &index, int role) const{
QVariant val;
switch(role){
case Qt::DisplayRole: case Qt::EditRole:
val= QString("Display (%1, %2)")
.arg(index.row(), 2, 10, QChar('0'))
.arg(index.column(), 2, 10, QChar('0'));
break;
case Qt::ToolTipRole:
val= QString("Tooltip (%1, %2)")
.arg(index.row(), 2, 10, QChar('0'))
.arg(index.column(), 2, 10, QChar('0'));
break;
case Qt::StatusTipRole:
val= QString("StatusTip (%1, %2)")
.arg(index.row(), 2, 10, QChar('0'))
.arg(index.column(), 2, 10, QChar('0'));
break;
}
return val;
}
};
class MainWindow : public QMainWindow{
Q_OBJECT
public:
explicit MainWindow(QWidget* parent= nullptr):QMainWindow(parent){
//set up GUI
layout.addWidget(&lineEditFilter);
layout.addWidget(&tableView);
setCentralWidget(&cw);
lineEditStatusBar.setReadOnly(true);
statusBar()->addPermanentWidget(&lineEditStatusBar);
//set up models
filterModel.setSourceModel(&model);
tableView.setModel(&filterModel);
connect(&lineEditFilter, &QLineEdit::textChanged, this, &MainWindow::updateFilter);
//turn on mouse tracking for the table view
tableView.setMouseTracking(true);
}
~MainWindow()= default;
Q_SLOT void updateFilter(const QString& text){
filterModel.setFilterFixedString(text);
}
protected:
//in order to intercept QStatusTipEvents
//and show tips in the line edit instead of the normal status bar
bool event(QEvent *event){
if(event->type() != QEvent::StatusTip) return QMainWindow::event(event);
QStatusTipEvent* statusTipEvent= static_cast<QStatusTipEvent*>(event);
lineEditStatusBar.setText(statusTipEvent->tip());
statusTipEvent->ignore();
return true;
}
private:
QWidget cw;
QVBoxLayout layout{&cw};
QLineEdit lineEditFilter;
QTableView tableView;
MyModel model;
QSortFilterProxyModel filterModel;
QLineEdit lineEditStatusBar;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow mw;
mw.show();
return a.exec();
}
#include "main.moc"
, 당신은 QTableView의 상속 신호 ['clicked'] (HTTP를 연결할 수 있습니다. qt.io/qt-4.8/qabstractitemview.html#clicked) 텍스트를 가져오고 QStatusBar :: setText()를 적절히 호출하는 함수 –
아이디어는 마우스가 움직이는 셀을 기반으로 상태 막대를 업데이트하는 것입니다. 나는 TableView의 mouseMoveEvent 신호를위한 슬롯을 가짐으로써이 동작을 얻을 수 있었지만, 필터링이 포함될 때 실패하고, 그 시점에서 모델 데이터에 접근 할 수 없다. – jehuty
[이 스레드] (http://www.qtcentre.org/threads/50677-Problem-with-QTableView-and-QSortFilterProxyModel)에는이 문제에 대한 토론이 있습니다. –