我已经为tableView创建了一个SpinBoxDelegate
。当我在表中编辑整数值(QVariant(时,即使它是一个QSpinBox
,editorWidget
的行为也像一个QDoubleSpinbox
。
我使用的是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;
}
}
您的委托似乎没有任何问题。请仔细比较我发布的解决方案与您自己的代码。对于将来,创建可重现的最小示例会有所帮助。
主.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;
};
旋转框代表.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);
}