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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTableView и виджет в нем  (Прочитано 27684 раз)
Sancho_s_rancho
Гость
« : Октябрь 12, 2008, 15:36 »

Задача: В таблице нарисовать виджеты( размером 60 на 60) содержащие QSpinBox.
Класс виджета:
Код:
Frame::Frame(QWidget *parent)
 : QWidget(parent)
{
sb = new QSpinBox(this);
resize(60,60);
}

Класс делегата:
Код:
SpinBoxDelegate::SpinBoxDelegate(QObject *parent)
    : QItemDelegate(parent)
{
}

QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex &/* index */) const
{
Frame *editor = new Frame(parent); 
    editor->sb->setMinimum(0);
    editor->sb->setMaximum(100);
    return editor;
}

void SpinBoxDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    int value = index.model()->data(index, Qt::EditRole).toInt();
    Frame *frame = static_cast<Frame*>(editor);
    frame->sb->setValue(value);
}

void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    Frame *frame = static_cast<Frame*>(editor);
    frame->sb->interpretText();
    int value = frame->sb->value();

    model->setData(index, value, Qt::EditRole);
}
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    editor->setGeometry(option.rect);
}
Создаю таблицу из нескольких элементов:
Код:
QStandardItemModel model(4, 2);
    QTableView tableView;
    tableView.setModel(&model);
    SpinBoxDelegate delegate;
    tableView.setItemDelegate(&delegate);
    tableView.setEditTriggers(QAbstractItemView::AllEditTriggers);
    for (int row = 0; row < 4; ++row)
    {
        for (int column = 0; column < 2; ++column)
        {
            QModelIndex index = model.index(row, column, QModelIndex());
            model.setData(index, QVariant((row+1) * (column+1)));
        }
    }
    tableView.setWindowTitle(QObject::tr("Spin Box Delegate"));
    tableView.show();

Результат: Виджета нет, QSpinbox появлется только при клике на ячейку.

Записан
Hort
Гость
« Ответ #1 : Октябрь 12, 2008, 15:40 »

Результат: Виджета нет, QSpinbox появлется только при клике на ячейку.

это не баг, это фича Подмигивающий
по идее все так и должно быть.
Записан
Sancho_s_rancho
Гость
« Ответ #2 : Октябрь 12, 2008, 15:43 »

Вот я и спрашиваю, как мне добиться желаемого поведения.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Октябрь 12, 2008, 18:51 »

посмотри пример %QTDIR%\examples\itemviews\stardelegate там звездочки всегда видны.
А то что ты сделал это предоставление виджета-редактора делегатом.
Записан

Юра.
Sancho_s_rancho
Гость
« Ответ #4 : Октябрь 12, 2008, 19:01 »

С этими звездочками черт ногу сломит.
Ладно, буду сидеть, медитировать...
Записан
denka
Гость
« Ответ #5 : Октябрь 12, 2008, 20:51 »

Тебе нужно переопределить метод paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const и в нем отрисовывать нужный тебе виджет.
Записан
crossly
Гость
« Ответ #6 : Октябрь 13, 2008, 13:20 »

Тебе нужно переопределить метод paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const и в нем отрисовывать нужный тебе виджет.
со звездочками именно так и происходит... Улыбающийся
Записан
EhTemka
Гость
« Ответ #7 : Октябрь 13, 2008, 18:32 »

Есть функции у QAbstractItemView:

void QAbstractItemView::openPersistentEditor ( const QModelIndex & index )
void QAbstractItemView::closePersistentEditor ( const QModelIndex & index )

Я так понимаю, то что тебе нужно, попробуй. Только это может тормозить если много эдиторов открыто
Записан
Sancho_s_rancho
Гость
« Ответ #8 : Октябрь 13, 2008, 19:41 »

Есть функции у QAbstractItemView:

void QAbstractItemView::openPersistentEditor ( const QModelIndex & index )
void QAbstractItemView::closePersistentEditor ( const QModelIndex & index )

Я так понимаю, то что тебе нужно, попробуй. Только это может тормозить если много эдиторов открыто
Спасибо, посмотрю
Записан
DpoHro
Гость
« Ответ #9 : Май 16, 2009, 12:23 »

Есть функции у QAbstractItemView:

void QAbstractItemView::openPersistentEditor ( const QModelIndex & index )
void QAbstractItemView::closePersistentEditor ( const QModelIndex & index )

Я так понимаю, то что тебе нужно, попробуй. Только это может тормозить если много эдиторов открыто

Это не работает!

Возник трабл по теме. Если кто знает решение огласите!
Не хочу новую тему открывать.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Май 16, 2009, 12:27 »

Я так понимаю, то что тебе нужно, попробуй. Только это может тормозить если много эдиторов открыто

Ему нужно то, что предложил den'ka. А как ему поможет твое предложение?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
DpoHro
Гость
« Ответ #11 : Май 16, 2009, 12:34 »

Я не предлагал, у меня подобная проблема. У меня по 2 колонкам делегаты QDateTimeEdit которые появляются при редактировании ячейки, но нужна колонка с QPushButton где кнопки должны быть постоянно видны, функция их - для удаления строки. То есть пользователь жмет кнопку и я удаляю эту строку. понятно что они должны быть всегда видны.

В ассистенте насамом деле говорится что
openPersistentEditor(index); - открывает делегата, но даже одного делегата оно не открывает.

Значит говоришь нужно отрисовывать самому? Но как то это не правильно. А если там должен быть комбобокс, его ж заморочишься рисовать. (( не понимаю я
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #12 : Май 16, 2009, 12:39 »

А если там должен быть комбобокс, его ж заморочишься рисовать. (( не понимаю я

Ничего подобного. См. QWidget::render(...)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
DpoHro
Гость
« Ответ #13 : Май 16, 2009, 12:44 »

Так вроде работает. Сорри, похоже у меня косяк в коде.

У меня не переопределена ф-я для QPushButton setData, на колонках с QDateTimeEdit
openPersistentEditor - работает, думаю что с кнопками сейчас разберусь.
поспешил вобщем вопросы задавать наверное =)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #14 : Май 16, 2009, 12:46 »

>>openPersistentEditor(index); - открывает делегата,
эта функция открывает не делегата, а виджет-редактор. Нужно всё по своим местам расставить, чтобы не было кашы у тебя в голове.
Записан

Юра.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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