首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QStatusBar中显示QAbstractTableModel的状态?

如何在QStatusBar中显示QAbstractTableModel的状态?
EN

Stack Overflow用户
提问于 2016-12-12 15:39:50
回答 1查看 915关注 0票数 1

我有QAbstractTableModel和QSortFilterProxyModel的自定义实现,用于过滤。表显示在一个QTableView中。

我的QTableView的父对话框有一个QStatusBar,带有一个只读QLineEdit小部件。

在QAbstractTableModel的重写data()方法中,我设置了Qt::StatusTipRole角色的相关值。

现在,我缺少了管道的一部分:如何在QStatusBar中的小部件中显示我的每个单元格的QStatusBar数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-12 21:42:53

不需要覆盖视图小部件。Qt提供内置支持,以显示模型中项的状态提示。

通常,当模型的QStringQStatusTipRole时,只需要从模型的data()返回一个QStatusTipRole,当您悬停项目时,QString将显示在状态栏中。

您还需要为鼠标跟踪打开QTableView,以便在不按鼠标按钮的情况下获得状态栏更新。这是因为当鼠标跟踪被禁用时(默认情况下),小部件只在按下鼠标按钮时才接收鼠标移动事件。

现在,为了在QLineEdit中而不是默认状态栏中显示这些状态提示,您可以重写主窗口的event函数,拦截QStatusTipEvent,并在QLineEdit中显示提示。

下面是一个实现示例:

代码语言:javascript
复制
#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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41104372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档