0

Qt の Spin Box Delegate Example からかなりコピーされたデリゲートを作成し、QTableView を埋めようとしています。ただし、テーブルのヘッダーは表示されるが、セルが空でクリックできないという奇妙な問題が発生しています。

QTableView とデリゲートの問題

デリゲートのコード:

#include "double_spinbox_delegate.h"

DoubleSpinBoxDelegate::DoubleSpinBoxDelegate(QObject *parent) : QItemDelegate(parent){}

QWidget *DoubleSpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
    QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
    editor->setValue(0);

//    if (index.column() == 0){
//        editor->setMinimum(0);
//        editor->setMaximum(255);
//    }
//    else{
//        editor->setMinimum(0);
//        editor->setMaximum(1);
//    }

    return editor;
}

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

    QDoubleSpinBox *doubleSpinBox = static_cast<QDoubleSpinBox*>(editor);
    doubleSpinBox->setValue(value);
}

void DoubleSpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{
    QDoubleSpinBox *doubleSpinBox = static_cast<QDoubleSpinBox*>(editor);
    doubleSpinBox->interpretText();
    double value = doubleSpinBox->value();

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

void DoubleSpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const{
    editor->setGeometry(option.rect);
}

フォームコンストラクターで呼び出している関数

void MainWindow::InitializeColorTable(){
    QTableView *tableColor = ui->tableColor;

    QStandardItemModel *model = new QStandardItemModel(4, 4, ui->tableColor);
    // QStandardItemModel *model = this->colorTableModel;
    tableColor->setModel(model);

    DoubleSpinBoxDelegate delegate;
    tableColor->setItemDelegate(&delegate);

    model->setHorizontalHeaderLabels(QStringList() << tr("Value") << tr("R") << tr("G") << tr("B"));

    for (int row = 0; row < model->rowCount(); ++row){
        for (int col = 0; col < model->columnCount(); ++col){
            QModelIndex index = model->index(row, col, QModelIndex());
            model->setData(index, QVariant((row + 1.0) * (col + 1.0)), Qt::EditRole);
        }
    }
}
4

1 に答える 1

2

デリゲートはスタックに割り当てられ、スコープ外になると削除されます。

DoubleSpinBoxDelegate delegate;
tableColor->setItemDelegate(&delegate);

代わりにnewでデリゲートを作成してください。

于 2013-03-21T02:54:39.263 に答える