SpinBoxDelegate отображается как DoubleSpinBoxDelegate - PullRequest
1 голос
/ 20 июня 2019

Я создал SpinBoxDelegate для tableView. Когда я редактирую целочисленное значение (QVariant) в таблице, editorWidget ведет себя как QDoubleSpinbox, хотя это QSpinBox.

Я использую QT 5.5.1 не текущую версию, и я взял код для делегата из документации Qt

QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
                                   const QStyleOptionViewItem &/* option 
*/,
                                   const QModelIndex &/* index */) const
{
QSpinBox *editor = new QSpinBox(parent);
editor->setFrame(false);
/*editor->setMinimum(0);
editor->setMaximum(100);*/

return editor;
}

void SpinBoxDelegate::setEditorData(QWidget *editor,
                                const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::EditRole).toInt();

QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue(value);
}

void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                               const QModelIndex &index) const
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->interpretText();
int value = spinBox->value();

model->setData(index, value, Qt::EditRole);
}

Я хочу, чтобы отображаемый виджет не имел десятичных знаков.

Это был код, вызывающий проблему ... Поскольку значение в QVariant было не целым числом, а двойным, я никогда не выделял делегата ...

for(int col = 1; col < mModel->columnCount() ;col++){
    QVariant::Type colType = mModel->data(mModel->index(0,col), Qt::DisplayRole).type();
    switch(colType){
        case QVariant::Int:
            ui->tableView->setItemDelegateForColumn(col, sbDelegate);
            break;
        case QVariant::String:
            break;
        case QVariant::Double:
            break;
        default: break;
    }
}

1 Ответ

0 голосов
/ 20 июня 2019

Кажется, с вашим делегатом все в порядке.Пожалуйста, сравните мое опубликованное решение с вашим собственным кодом.В будущем было бы полезно создать воспроизводимые минимальные примеры.

main.cpp

#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include "SpinboxDelegate.h"

int main(int argc, char** args) {
    QApplication app(argc, args);
    auto tableView = new QTableView;
    auto model=new QStandardItemModel;
    model->setRowCount(2);
    model->setColumnCount(2);
    tableView->setModel(model);
    tableView->setItemDelegate(new SpinBoxDelegate);
    tableView->show();
    app.exec();
}

SpinboxDelegate.h

#include <QStyledItemDelegate>

class SpinBoxDelegate : public QStyledItemDelegate
{
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex & ) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
};

SpinboxDelegate.cpp

#include "SpinboxDelegate.h"

#include <QSpinBox>

QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
                                   const QStyleOptionViewItem &/* option 
*/,
                                   const QModelIndex &/* index */) const
{
QSpinBox *editor = new QSpinBox(parent);
editor->setFrame(false);
/*editor->setMinimum(0);
editor->setMaximum(100);*/

return editor;
}

void SpinBoxDelegate::setEditorData(QWidget *editor,
                                const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::EditRole).toInt();

QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue(value);
}

void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                               const QModelIndex &index) const
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->interpretText();
int value = spinBox->value();

model->setData(index, value, Qt::EditRole);
}
...