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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Помогите разобраться с делегатами  (Прочитано 11449 раз)
trenkinan
Гость
« : Май 06, 2010, 00:14 »

Есть таблица  QSqlQueryModel+ QTableView.
Все отображается, все рады. Нужно сделать ячейки редактируемыми. Разные столбцы буду редактировать разными виджентами(для начала редактирование текста, далее по аналогии QSpinBox думаю прикручу). Объясните по порядку ход действий. Пока разбор примеров ни к чему не привел. Приведеите пример как реализовать делегат для редакирования столбца "Фамилия". Заранее спасибо.
Записан
alexman
Гость
« Ответ #1 : Май 06, 2010, 08:02 »

Сначала поиском нужно попробовать воспользоваться!
http://doc.crossplatform.ru/qt/4.5.0/model-view-delegate.html
Записан
cya-st
Гость
« Ответ #2 : Май 06, 2010, 10:06 »

Есть в книге пример "Бланшет,Саммерфилд - QT4 Программирование GUI на С++.2ed", доходчиво описано.
Записан
crossly
Гость
« Ответ #3 : Май 06, 2010, 14:10 »

товарисч.... для начала надо сделать модель редактируемой.... т.е. вам надо унаследоватся от QSqlQueryModel переопределить как минимум методы setData и flags ....
Записан
vpara
Гость
« Ответ #4 : Май 06, 2010, 17:39 »

У бланшета всё понятно ... но предполжим мне нужно иметь чтото типа QDateEdit (с календарем со всеми делами) в столбце QTableView ... начал прикручивать пример для своего случая ... пока безуспешно ... может это можно сделать както проще?
Записан
alexman
Гость
« Ответ #5 : Май 06, 2010, 20:08 »

А в чем проблема?
Записан
cya-st
Гость
« Ответ #6 : Май 06, 2010, 20:31 »

У бланшета всё понятно ... но предполжим мне нужно иметь чтото типа QDateEdit (с календарем со всеми делами) в столбце QTableView ... начал прикручивать пример для своего случая ... пока безуспешно ... может это можно сделать както проще?
У Бланшета в книге есть глава "Реализация пользовательских делегатов", где вполне доступно изложено с примером.
Записан
trenkinan
Гость
« Ответ #7 : Май 06, 2010, 23:28 »

перешел на QSqlTableModel и все стало хорошо, заработал QLine edit и QSpinbox(правда его придетс доточить для работы с целыми) Ну и хотелось бы календарик создать, будем пытаться... Всем спасибо
Записан
trenkinan
Гость
« Ответ #8 : Май 07, 2010, 18:58 »

На ночь глядя не заметил, что данные то редактируются, только вот изменения  сохраняются не всегда... иногда пишет в qDebug   :
Код:
Object::connect: No such slot MainWindow::currentChanged() in mainwindow.cpp:163
Object::connect:  (receiver name: 'MainWindowClass')
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.

а иногда нормально...парадокс.  Обычно ошибка появляется при первом запуске проекта, при последующих данные сохраняются 
Записан
Marat(Qt)
Гость
« Ответ #9 : Май 08, 2010, 09:31 »

Насчет сохранения изменений - тебе вероятно нужно про QSqlTableModel::setEditStrategy почитать, а то что у тебя вызывается слот currentChanged - которого на самом деле нет, это вроде как к сохранению данных не относится
Записан
trenkinan
Гость
« Ответ #10 : Май 08, 2010, 12:30 »

использую такую:
Код:
 model1->setEditStrategy(QSqlTableModel::OnRowChange);
Записан
trenkinan
Гость
« Ответ #11 : Май 08, 2010, 15:50 »

Хорошо, с этим вроде как разобрались. Теперь вопрос, как собственно прикрутить красивый календарь к 9-му столбцу?
Создаю класс делегат в хедере:
Код:
class Calendar : public QItemDelegate {
        Q_OBJECT
    public:
      Calendar(bool calpopup = true,
                     QObject *parent = 0);
         QWidget *createEditor(
                    QWidget *parent,
                    const QStyleOptionViewItem &option,
                    const QModelIndex &index);
         void setEditorData(QWidget *editor,
                           const QModelIndex &index);
        void setModelData(QWidget *editor,
                          QAbstractItemModel *model,
                          const QModelIndex &index);
        void updateEditorGeometry(
                QWidget *editor,
                const QStyleOptionViewItem &option,
                const QModelIndex &index);
    private:
        bool m_calpopup;
    };

Далее почитав примеров так и не понял что делать
Записан
trenkinan
Гость
« Ответ #12 : Май 10, 2010, 10:16 »

 ладно, тогда вот вопрос: Можно ли без использования внешних ключей( и соответственно дополнительных таблиц ) реализовать выпадающий список?
Записан
alexman
Гость
« Ответ #13 : Май 10, 2010, 10:38 »

ладно, тогда вот вопрос: Можно ли без использования внешних ключей( и соответственно дополнительных таблиц ) реализовать выпадающий список?
Это combo box делегат: http://doc.qt.nokia.com/4.6/widgets-icons-imagedelegate-cpp.html
Записан
trenkinan
Гость
« Ответ #14 : Май 10, 2010, 11:55 »

Ok. Пишу делегат как в примере:
Код
C++ (Qt)
ImageDelegate::ImageDelegate(QObject *parent)
    : QItemDelegate(parent)
{
}
 
QWidget *ImageDelegate::createEditor(QWidget *parent,
                                     const QStyleOptionViewItem & /* option */,
                                     const QModelIndex &index) const
{
    QComboBox *comboBox = new QComboBox(parent);
    if (index.column() == 6) {
        comboBox->addItem(tr("Да"));
        comboBox->addItem(tr("Нет"));
    }
 
    connect(comboBox, SIGNAL(activated(int)), this, SLOT(emitCommitData()));
 
    return comboBox;
}
 
void ImageDelegate::setEditorData(QWidget *editor,
                                  const QModelIndex &index) const
{
    QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
    if (!comboBox)
        return;
 
    int pos = comboBox->findText(index.model()->data(index).toString(),
                                 Qt::MatchExactly);
    comboBox->setCurrentIndex(pos);
}
 
void ImageDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                 const QModelIndex &index) const
{
    QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
    if (!comboBox)
        return;
 
    model->setData(index, comboBox->currentText());
}
 
void ImageDelegate::emitCommitData()
{
    emit commitData(qobject_cast<QWidget *>(sender()));
}
 
Но ничего не происходит
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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