如何在 QListView 上始终显示最新条目
How to show latest entry on a QListView always on top
从下面的打印屏幕可以看出,我有以下 问题: 当我通过 QPushButton
添加条目时,我不想要最后一个条目成为 QListView
的最后一个,但我希望它位于 QListView
的顶部。如何使 QListView 始终从最新条目显示到最后条目?
所需的行为 最新条目位于顶部:
代码下方:
mainwindow.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);
}
mainwindow.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
但我不确定这是否真的是正确的路线。我 运行 不知道如何解决这个问题。
到目前为止我做了什么:
我研究了这个问题,发现 帮助我设置了正确的索引。但是并没有完全解决问题。
我也参考了official documentation,但是我的问题不是关于scolling应该如何,而是如何确定最新条目并将其作为QListView
的第一项。
我并没有就此停下来继续挖掘并到达 this command 但我不确定它是否适用于我正在解决的问题。
感谢您指出解决此问题的正确方向
void MainWindow::updateListView(const QString & message)
{
if(model->insertRow(0) {
QModelIndex index = model->index(0, 0);
model->setData(index, message);
ui->listView->scrollTo(0);
}
}
应该做这项工作,不是吗?当前您将行插入最后一个位置,只需将其插入第一个位置...
从下面的打印屏幕可以看出,我有以下 问题: 当我通过 QPushButton
添加条目时,我不想要最后一个条目成为 QListView
的最后一个,但我希望它位于 QListView
的顶部。如何使 QListView 始终从最新条目显示到最后条目?
所需的行为 最新条目位于顶部:
代码下方:
mainwindow.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);
}
mainwindow.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
但我不确定这是否真的是正确的路线。我 运行 不知道如何解决这个问题。
到目前为止我做了什么:
我研究了这个问题,发现
我也参考了official documentation,但是我的问题不是关于scolling应该如何,而是如何确定最新条目并将其作为QListView
的第一项。
我并没有就此停下来继续挖掘并到达 this command 但我不确定它是否适用于我正在解决的问题。
感谢您指出解决此问题的正确方向
void MainWindow::updateListView(const QString & message)
{
if(model->insertRow(0) {
QModelIndex index = model->index(0, 0);
model->setData(index, message);
ui->listView->scrollTo(0);
}
}
应该做这项工作,不是吗?当前您将行插入最后一个位置,只需将其插入第一个位置...