Implementierung des QT-Fortschrittsbalken-Agenten

Zweck

Auch der Fortschrittsbalken stellt eine Grundfunktion dar. Hier möchte der Fortschrittsbalken im Tableview implementiert werden, damit eine der Zellen des Tableviews den Fortschrittsbalken anzeigen kann, da der Proxy verwendet wird.
Was ein Proxy ist, sagte der Beamte:
Der Proxy (Delegate) soll einen Editor zum Bearbeiten von Daten in der Ansichtskomponente bereitstellen. Wenn Sie beispielsweise Zelldaten in einer Tabellenkomponente bearbeiten, wird standardmäßig ein OLineEdit-Bearbeitungsfeld verwendet.
Der Agent ist dafür verantwortlich, die entsprechenden Daten aus dem Datenmodell abzurufen, sie dann im Editor anzuzeigen und nach der Änderung der Daten im Datenmodell zu speichern.
Wenn ich es verstehe, fühlt sich dieser Agent auch ziemlich kompliziert an und er macht dies und das.
Denken Sie darüber nach, es ist ganz einfach: Der Proxy ist ein neues Steuerelement, das einige oder alle Funktionen des ursprünglichen Steuerelements ersetzt, und das neue Steuerelement wird als Proxy bezeichnet. Es handelt sich um die Einführung anderer Steuerelemente einfach, in der Anwendung, erleben Sie es langsam.

Umsetzungsprozess

Die Proxy-Implementierung der Bildlaufleiste:

#include "progressbardelegate.h"
ProgressBarDelegate::ProgressBarDelegate(QObject *parent) :
    QItemDelegate(parent)
{
    
    
}
void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    
    
    //if(index.isValid() && index.column() == 1)
    if(index.isValid())
    {
    
    
        int value = index.model()->data(index).toInt();
        QStyleOptionProgressBar progressBarOption;
        //progressBarOption.rect = option.rect.adjusted(4, 4, -4, -4);
        progressBarOption.rect = option.rect;
        progressBarOption.minimum = 0;
        progressBarOption.maximum = 100;
        progressBarOption.textAlignment = Qt::AlignRight;
        progressBarOption.textVisible = true;
        progressBarOption.progress = value;
        progressBarOption.text = tr("%1%").arg(progressBarOption.progress);
        painter->save();
        if (option.state & QStyle::State_Selected) {
    
    
            painter->fillRect(option.rect, option.palette.highlight());
                    painter->setBrush(option.palette.highlightedText());
        }
        QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
        painter->restore();
    }
    else
    {
    
    
        QItemDelegate::paint(painter, option, index);
    }
}

Die Anwendung des Proxys der Bildlaufleiste:

.......
m_delegate = new ProgressBarDelegate();
    //ui->tableView->setItemDelegate(m_delegate);
    ui->tableView->setItemDelegateForColumn(1, m_delegate);
    timer = new QTimer();
    connect(timer, &QTimer::timeout, this, &MainWindow::download);
    timer->setInterval(1000);
    timer->start();
....
    void MainWindow::download()
{
    
    
    for(auto i = 0; i < this->m_tableViewModel->getStandardItemModel()->rowCount(); i++)
    {
    
    
        int value = this->m_tableViewModel->getStandardItemModel()->index(i,1).data().toInt();
        value++;
        this->m_tableViewModel->getStandardItemModel()->setData(this->m_tableViewModel->getStandardItemModel()->index(i,1), value);
    }
}

Der Endeffekt:
Fügen Sie hier eine Bildbeschreibung ein

Zusammenfassen

Der Schlüssel zur Realisierung dieses Effekts ist:
void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
QItemDelegate, das die Standardimplementierung von Funktionen zum Zeichnen von Elementdaten in der Ansicht und zum Bearbeiten von Daten in der bereitstellt Artikelmodell.
Standardimplementierungen der in QAbstractItemDelegate definierten virtuellen Funktionen paint() und sizeHint() werden bereitgestellt, um sicherzustellen, dass der Delegat das richtige, von der Ansicht erwartete Grundverhalten implementiert.
Sie können diese Funktionen in Unterklassen erneut implementieren, um das Erscheinungsbild des Elements anzupassen.
Die Realisierung dieser Funktion, der Zweck dieser Funktion ist der Zustand des Steuerelements, einschließlich des Standardzustands und anderer Zustände, in einfachen Worten, es ist die Anzeige.
Da die Bearbeitung nicht verwendet wird, werden die von Edit berührten Funktionen nicht geschrieben, z. B. createEditor(…), setModelData(…).
Dies ist die Implementierung des Fortschrittskontrollagenten.
Sein Kern besteht darin, ein weiteres Steuerelement in ein Steuerelement einzuführen, und der Agent ist das eingeführte Steuerelement. Hier ist der Agent ProgressBarDelegate, daher werden Sie viel verstehen: Der Agent bedeutet hier Ersatz. Steuerung 2 ersetzt das Verhalten von Teil von Steuerung 1
. Dann ist die Steuerung 2 der Proxy:
Die Proxy-Steuerung 2 fungiert im Namen der Steuerung 1, und die tatsächliche Ausführung ist das Verhalten der Proxy-Steuerung 1, da es sich um eine Ersatzbeziehung handelt.
Fügen Sie hier eine Bildbeschreibung ein

Guess you like

Origin blog.csdn.net/maokexu123/article/details/131479719