Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: INZER от Июнь 20, 2013, 11:00



Название: QTableView + делегат
Отправлено: INZER от Июнь 20, 2013, 11:00
День добрый,
Не могу догнать где затупил помогите плиззз

Код:
QTableView * tvGU;
GroundUserSqlModel modelGU;

Модель:
Код:
class GroundUserSqlModel: public QSqlQueryModel
{
    Q_OBJECT
public:
    GroundUserSqlModel (QObject * parent=0);
    QVariant data (const QModelIndex &item, int role) const
    {
        QVariant value = QSqlQueryModel::data(item,role);
        if (role == Qt::DisplayRole && item.column()==2) // отображение данных в таблице
        {
            switch (value.toInt())
            {
            case 1:
                value = QVariant(QString::fromLocal8Bit("DSP"));
                break;
            case 2:
                value = QVariant(QString::fromLocal8Bit("УВД"));
                break;
            case 3:
                value = QVariant(QString::fromLocal8Bit("Авиакомпания"));
                break;
            default:
                break;
            }
        }
        return value;
    }
};

Делегат:
Код:
class GUDelegate: public QStyledItemDelegate
{
    Q_OBJECT
public:
    GUDelegate (QObject *p = 0): QStyledItemDelegate(p) {}
protected:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        QStyledItemDelegate::paint(painter,option,index);
    }
    QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        QLineEdit * edit = new QLineEdit(parent);
        return edit;
    }
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        QStyledItemDelegate::setModelData(editor,model,index);
    }
};

Конструктор:
Код:
    ui->tvGU->setModel(&modelGU);
    ui->tvGU->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tvGU->setItemDelegate(new GUDelegate (ui->tvGU));
    ui->tvGU->setEditTriggers(QAbstractItemView::DoubleClicked);

Однако при двойном клике по полю таблицы QLineEdit (поле редактрования) не появляется. Что я забыл?


Название: Re: QTableView + делегат
Отправлено: INZER от Июнь 20, 2013, 13:15
Немного поэкспериментрировал заменил QSqlQueryModel на QStandardItemModel и все заработало без изменения остального кода (кроме ручного заполнения модели).
С чем это может быть связано? Неужели нельзя редактировать QTableView, построенную на основе модели QSqlQueryModel?
Не хочется менять QSqlQueryModel на QSqlQuery + QStandardItemModel.


Название: Re: QTableView + делегат
Отправлено: dio от Июнь 20, 2013, 13:35
Данная модель только для чтения.

Цитировать
The QSqlQueryModel class provides a read-only data model for SQL result sets.

http://qt-project.org/doc/qt-5.0/qtsql/qsqlquerymodel.html (http://qt-project.org/doc/qt-5.0/qtsql/qsqlquerymodel.html)