C++ 如何在QListView上始终显示最新条目

C++ 如何在QListView上始终显示最新条目,c++,qt,c++11,qt5,qlistview,C++,Qt,C++11,Qt5,Qlistview,从下面的打印屏幕可以看出,我有以下问题:当我通过QPushButton添加条目时,我不希望最后一个条目是QListView的最后一个条目,而是希望它位于QListView的顶部。如何使QListView始终从最新条目显示到最后一个条目 所需的行为顶部有最新条目: 代码如下: main window.cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent)

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

所需的行为顶部有最新条目:

代码如下:

main window.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);
}
main window.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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
#包括
QT_开始名称空间
命名空间Ui{class MainWindow;}
QT_END_名称空间
类主窗口:公共QMainWindow
{
Q_对象
公众:
主窗口(QWidget*parent=nullptr);
~main窗口();
void updateListView();
无效updateListView(常量QString和消息);
信号:
无效日志更新();
专用插槽:
单击按钮时无效();
私人:
Ui::MainWindow*Ui;
QGraphicsView*mView;
qgraphicscene*mScene;
QGraphicsTextItem*多行文字;
QStringListModel*模型;
};
#endif//main窗口
我想知道是否有一些丢失的信号我没有捕捉到,或者在这一点上我是否应该使用
Q_属性
,但我不确定这是否是正确的路线。关于如何解决这个问题,我已经没有什么想法了

到目前为止我所做的:

我研究了这个问题,发现它帮助我设置了适当的索引。然而,这无助于彻底解决问题

我还咨询了,但是我的问题不是scolling应该如何,而是如何确定最新条目并将其作为
QListView
的第一项

我没有停下来,挖了更多的东西,到达了目的地,但我不确定这是否适用于我正在解决的问题

感谢你为解决这个问题指明了正确的方向

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

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

再次感谢您给我的建议:)。如果你也认为我的问题很清楚,请竖起大拇指:)祝你有一个美好的一天!