Как показать статус QAbstractTableModel в QStatusBar?

У меня есть пользовательская реализация QAbstractTableModel и QSortFilterProxyModel, используемая для фильтрации. Таблица показана в QTableView.

Родительский диалог моего QTableView имеет QStatusBar с виджетом QLineEdit только для чтения.

В моем переопределенном методе data () класса QAbstractTableModel я устанавливаю соответствующие значения для роли Qt :: StatusTipRole.

Теперь мне не хватает части сантехники: как мне получить данные StatusTipRole для каждой ячейки, которые будут отображаться в моем виджете внутри QStatusBar?

1

Решение

Нет необходимости переопределять виджет вида. Qt предоставляет встроенную поддержку для отображения подсказок о состоянии элементов в модели.

Обычно вам просто нужно вернуть QString от вашей модели data() когда role является QStatusTipRole, и это QString будет отображаться в строке состояния при наведении курсора на элемент.

Вам также нужно включить отслеживание мыши для QTableView так что вы получаете обновления строки состояния без нажатия кнопки мыши. Это связано с тем, что когда отслеживание мыши отключено (по умолчанию), виджет получает события перемещения мыши только при нажатии кнопки мыши.

Теперь, чтобы отобразить эти подсказки о статусе в вашем QLineEdit вместо строки состояния по умолчанию, вы можете переопределить главное окно event функция, перехват QStatusTipEventи показать советы в вашем QLineEdit,

Вот пример реализации:

Скриншот

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]