Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Max Payne от Май 24, 2010, 17:54



Название: QAbstractItemDelegate
Отправлено: Max Payne от Май 24, 2010, 17:54
Помогите разобраться..
Есть таблица заполняемая с базы даных... необходимо в таблице сделать столбик ComboBox с двумя возможными значениями..
вот таблица:


TableEditor::TableEditor(const QString &tableName, QWidget *parent)
    : QDialog(parent)
{
    model = new QSqlTableModel(this);
    model->setTable(tableName);
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();

    model->setHeaderData(0, Qt::Horizontal, tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, tr("Keyword"));
    model->setHeaderData(2, Qt::Horizontal, tr("Path to file"));
    model->setHeaderData(3,Qt::Horizontal,tr("Key_v"));
    model->setHeaderData(3,Qt::Horizontal,tr("Path_v"));
    model->setHeaderData(3,Qt::Horizontal,tr("Key_e"));
    model->setHeaderData(3,Qt::Horizontal,tr("Path_e"));

//!
  • //! [1]
    QTableView *view = new QTableView;
    view->setModel(model);

 // тут я пытаюсь вставить комбо бокс

YStdDelegate booldelegate(YStdDelegate::TBool);
    tableView.setItemDelegateForColumn(0, &booldelegate);

    submitButton = new QPushButton(tr("Submit"));
    submitButton->setDefault(true);
    revertButton = new QPushButton(tr("&Revert"));
    quitButton = new QPushButton(tr("Quit"));

    buttonBox = new QDialogButtonBox(Qt::Vertical);
    buttonBox->addButton(submitButton, QDialogButtonBox::ActionRole);
    buttonBox->addButton(revertButton, QDialogButtonBox::ActionRole);
    buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
//! [2]

//! [3]
    connect(submitButton, SIGNAL(clicked()), this, SLOT(submit()));
    connect(revertButton, SIGNAL(clicked()), model, SLOT(revertAll()));
    connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
//! [3]

//! [4]
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(view);
    mainLayout->addWidget(buttonBox);
    setLayout(mainLayout);

    setWindowTitle(tr("Cached Table"));

}

void TableEditor::submit()
{
    model->database().transaction();
    if (model->submitAll()) {
        model->database().commit();
    } else {
        model->database().rollback();
        QMessageBox::warning(this, tr("Cached Table"),
                             tr("The database reported an error: %1")
                             .arg(model->lastError().text()));
    }
}
А вот сама реализация класа делегирования :

YStdDelegate::YStdDelegate(TypeEditor type, QObject *parent)
    : QItemDelegate(parent)
{
   typeeditor = type;
}

QWidget *YStdDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &,
                           const QModelIndex &) const
{
  QWidget *editor;

   switch(typeeditor)
   {
        case TBool:
                    {
         QComboBox *cmbox = new QComboBox(parent);
         cmbox->addItem("0");
         cmbox->addItem("1");
         return static_cast<QWidget *>(cmbox);
                    }
   }
   return editor;
}

void YStdDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QVariant data = index.model()->data(index, Qt::DisplayRole);
   switch(typeeditor)
   {
        case TBool:
            {
         QComboBox *cmbox = static_cast<QComboBox *>(editor);
         if (data.toInt())
         {
            cmbox->setCurrentIndex(cmbox->findText("1"));
         }
         else
         {
            cmbox->setCurrentIndex(cmbox->findText("0"));
         }
         break;
                    }
   }
}

void YStdDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
  QVariant data;
   switch(typeeditor)
   {
      case TBool:
         QComboBox *cmbox = static_cast<QComboBox *>(editor);
         data = cmbox->currentText();
         break;
   }
    model->setData(index, data, Qt::EditRole);
}
void YStdDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    editor->setGeometry(option.rect);
}


Название: Re: QAbstractItemDelegate
Отправлено: Max Payne от Май 24, 2010, 17:55
Помогите ни как не могу понять что не так..


Название: Re: QAbstractItemDelegate
Отправлено: kibsoft от Май 24, 2010, 18:03
Если тебе нужно, чтобы в таблице в качестве редактора выступал комбобокс, то посмотри пример в ассистенте: Spin Box Delegate Example. Замени SpinBox на ComboBox и все.


Название: Re: QAbstractItemDelegate
Отправлено: crossly от Май 24, 2010, 18:10
а в чем хоть проблема??


Название: Re: QAbstractItemDelegate
Отправлено: kibsoft от Май 24, 2010, 18:11
а в чем хоть проблема??
+1


Название: Re: QAbstractItemDelegate
Отправлено: Max Payne от Май 24, 2010, 18:25
не оттображает мой комбо бокс...


Название: Re: QAbstractItemDelegate
Отправлено: Max Payne от Май 24, 2010, 18:29
// тут я пытаюсь вставить комбо бокс

YStdDelegate booldelegate(YStdDelegate::TBool);
    tableView.setItemDelegateForColumn(0, &booldelegate);


Название: Re: QAbstractItemDelegate
Отправлено: BRE от Май 24, 2010, 18:31
// тут я пытаюсь вставить комбо бокс

YStdDelegate booldelegate(YStdDelegate::TBool);
    tableView.setItemDelegateForColumn(0, &booldelegate);

А почему ты его на стеке создаешь?
Создавай через new.


Название: Re: QAbstractItemDelegate
Отправлено: crossly от Май 24, 2010, 18:44
+1


Название: Re: QAbstractItemDelegate
Отправлено: Az от Май 24, 2010, 19:53
Я смотрю тема насущная. Пример из ассистента переделывается довольно просто, сам вчера этим занимался.