Как показать последнюю запись в QListView всегда сверху - PullRequest
0 голосов
/ 28 апреля 2020

Как можно видеть из экрана печати ниже, у меня возникает следующая проблема : при добавлении записи через QPushButton Я не хочу, чтобы последняя запись была последней из QListView но вместо этого я хочу, чтобы он был на вершине QListView. Как сделать так, чтобы QListView всегда показывал от самой последней записи до последней записи?

view_wrong

Желаемое поведение с последней записью сверху:

correct

Ниже кода:

основное окно. 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, но я не уверен, что это действительно правильный маршрут. У меня заканчиваются идеи, как решить эту проблему.

Что я сделал до сих пор:

Я исследовал проблему и обнаружил этот источник , который помог мне установить правильный индекс. Однако это не помогло полностью решить проблему.

Я также обратился к официальной документации , однако моя проблема не связана с тем, как должно быть вычитание, а как определить последнюю запись и поставить это как первый пункт QListView.

Я не остановился на этом, вырыл больше и прибыл к этой команде , но я не уверен, что она применима к проблеме, которую я решаю .

Спасибо за указание правильного направления, как решить эту проблему

1 Ответ

1 голос
/ 28 апреля 2020
void MainWindow::updateListView(const QString & message)
{
    if(model->insertRow(0) {
        QModelIndex index = model->index(0, 0);
        model->setData(index, message);
        ui->listView->scrollTo(0);
    }
}

должен делать работу, нет? в настоящее время вы вставляете свою строку в последнюю позицию, просто вставьте ее в первую позицию ...

...