【问题标题】:How to show latest entry on a QListView always on top如何始终在顶部显示 QListView 上的最新条目
【发布时间】:2020-08-12 17:18:43
【问题描述】:

从下面的打印屏幕可以看出,我有以下 问题: 当我通过 QPushButton 添加条目时,我不希望最后一个条目成为 @ 的最后一个条目987654327@ 但我希望它位于QListView 的顶部。如何使 QListView 始终从最新条目显示到最后一个条目?

所需的行为是最新条目位于顶部:

代码下方:

ma​​inwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mView = new QGraphicsView();
    mScene = new QGraphicsScene();
    ui->graphicsView->setScene(mScene);

    QFont font;
    font.setPixelSize(10);
    font.setBold(false);
    font.setFamily("Calibri");

    mText = new QGraphicsTextItem;
    mText->setPos(150,70);
    mScene->addText(tr("Boat outside alarm area"))->setDefaultTextColor(Qt::black);

    model = new QStringListModel();
    ui->listView->setModel(model);
    ui->listView->setEditTriggers(QAbstractItemView::NoEditTriggers);

    connect(ui->listView, SIGNAL(loggingUpdated()), this, SLOT(updateListView(const QString &)));
}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::updateListView(const QString & message)
{
    if(model->insertRow(model->rowCount())) {
        QModelIndex index = model->index(model->rowCount() - 1, 0);
        model->setData(index, message);
        ui->listView->scrollTo(index);
    }
}

void MainWindow::on_pushButton_clicked()
{
    QString str = ui->lineEdit->text();
    model->insertRow(model->rowCount());
    QModelIndex index = model->index(model->rowCount()-1);
    model->setData(index, str);
}

ma​​inwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsTextItem>
#include <QStringListModel>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void updateListView();
    void updateListView(const QString & message);

signals:
    void loggingUpdated();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QGraphicsView *mView;
    QGraphicsScene *mScene;
    QGraphicsTextItem *mText;
    QStringListModel *model;

};
#endif // MAINWINDOW_H

我想知道是否有一些我没有捕捉到的丢失信号,或者此时我是否应该使用Q_PROPERTY,但我不确定这是否真的是正确的路线。我对如何解决这个问题没有任何想法。

到目前为止我做了什么:

我研究了这个问题,发现this source 帮助我设置了正确的索引。然而这并没有帮助彻底解决问题。

我也咨询了official documentation,但是我的问题与scolling应该如何无关,而是如何确定最新条目并将其作为QListView的第一项。

我并没有停下来,挖得更多,然后到达this command,但我不确定它是否适用于我正在解决的问题。

感谢您指出如何解决此问题的正确方向

【问题讨论】:

    标签: c++ qt c++11 qt5 qlistview


    【解决方案1】:
    void MainWindow::updateListView(const QString & message)
    {
        if(model->insertRow(0) {
            QModelIndex index = model->index(0, 0);
            model->setData(index, message);
            ui->listView->scrollTo(0);
        }
    }
    

    应该做这份工作,不是吗?当前您将行插入到最后一个位置,只需将其插入到第一个位置...

    【讨论】:

    • 再次感谢您给我的建议 :)。如果你也认为我的问题很清楚,请给我竖起大拇指:)祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多