Russian Qt Forum
Ноябрь 22, 2024, 23:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите новичку по QItemDelegate  (Прочитано 9779 раз)
muaddib1981@mail.ru
Гость
« : Май 26, 2009, 09:52 »

Взял делегат из примера: http://doc.crossplatform.ru/qt/4.5.0/model-view-delegate.html

В программе при двойном щелчке мыши, spinbox в первом столбце не появляется, что я делаю неправильно?

MainWindow.h:
Код:
#pragma once
#include <QtGui>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include "SpinBoxDelegate.h"

class CMainWindow:public QMainWindow
{
public:
CMainWindow(QString path);
~CMainWindow(void);
private:
QWidget *mainWidget;
QGridLayout *mainLayout;
QSqlQueryModel *querymodel;
QTableView *tableview;
    QSqlDatabase *db;
};


MainWindow.cpp
Код:
#include "MainWindow.h"

CMainWindow::CMainWindow(QString path)
{
bool ok;
mainWidget=new QWidget();
this->setCentralWidget(mainWidget);
mainLayout=new QGridLayout();
mainWidget->setLayout(mainLayout);

db=new QSqlDatabase();
    (*db) = QSqlDatabase::addDatabase("QODBC");
    db->setDatabaseName(QString("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=") +path+QString("\\books.mdb"));
ok=db->open();

QSqlQueryModel *model = new QSqlQueryModel(0);
model->setQuery("SELECT num_area,author,bookname from books");
    model->setHeaderData(0, Qt::Horizontal, tr("num_area"));
    model->setHeaderData(1, Qt::Horizontal, tr("author"));
    model->setHeaderData(2, Qt::Horizontal, tr("bookname"));

tableview=new QTableView(0);
tableview->setModel(model);
tableview->show();
   
SpinBoxDelegate *spinboxdelegate=new SpinBoxDelegate(tableview);
tableview->setItemDelegateForColumn(0,spinboxdelegate);

mainLayout->addWidget(tableview);
}

CMainWindow::~CMainWindow(void)
{
}

SpinBoxDelegate.h

Код:
#include <QtGui>

 class SpinBoxDelegate : public QItemDelegate
 {
     Q_OBJECT

 public:
     SpinBoxDelegate(QObject *parent = 0);

     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                           const QModelIndex &index) const;

     void setEditorData(QWidget *editor, const QModelIndex &index) const;
     void setModelData(QWidget *editor, QAbstractItemModel *model,
                       const QModelIndex &index) const;

     void updateEditorGeometry(QWidget *editor,
         const QStyleOptionViewItem &option, const QModelIndex &index) const;
 };

SpinBoxDelegate.cpp

Код:
#include "SpinBoxDelegate.h"

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

 QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
     const QStyleOptionViewItem &/* option */,
     const QModelIndex &/* index */) const
 {
     QSpinBox *editor = new QSpinBox(parent);
     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);
 }

  void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
     const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
 {
     editor->setGeometry(option.rect);
 }
Записан
spirit
Гость
« Ответ #1 : Май 26, 2009, 10:07 »

попробуй так
Код
C++ (Qt)
SpinBoxDelegate *spinboxdelegate=new SpinBoxDelegate(tableview);
tableview->setItemDelegate(spinboxdelegate);
 
Записан
crossly
Гость
« Ответ #2 : Май 26, 2009, 10:09 »

QSqlQueryModel не является редактируемой.... используй QSqlTabelModel.... или наследуйся...
Записан
roman.ks
Гость
« Ответ #3 : Июнь 10, 2009, 09:53 »

+ к предыдущему ответу См.  QAbstractItemModel::flags  ==>  Qt::ItemIsEditable
Записан
zagruzkaaa
Гость
« Ответ #4 : Декабрь 23, 2015, 02:23 »

И как быть в такой ситуации??? если унаследовать от QAbstractItemModel , то подскажите пожалуйста как там переопределить paint, чтобы запись нормально отобразилась в таблице? спасибО!
Записан
Bepec
Гость
« Ответ #5 : Декабрь 28, 2015, 12:04 »

Вам нужно использовать QSqlTableModel или сделать модель самому.
QSqlQueryModel является моделью для чтения, она не поддерживает изменение данных.

Последний вопрос про переопределение paint я не понял. Стандартная модель поддерживает все типы данных, за исключением разве байтовых массивов, вроде аля BLOB. Ну придётся написать свой делегат, но это ненапряжно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.116 секунд. Запросов: 21.