Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / CheckBox в QTableView / 11 сообщений из 11, страница 1 из 1
09.01.2010, 14:31
    #36401528
Viper360
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
Доброго времени суток! Пытаюсь QTableView заставить отображать CheckBox-ы вместо true/false (boolean postgresql). Создал делегат :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
CheckBoxDelegate::CheckBoxDelegate(QObject *parent)
: QItemDelegate(parent)
{
}

QWidget *CheckBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const {
  if(index.isValid()&&index.column()== 9 ) {
    QCheckBox *editor=new QCheckBox(parent);
    editor->installEventFilter(const_cast<CheckBoxDelegate*>(this));
    return editor;
  } else {
    return QItemDelegate::createEditor(parent,option,index);
  }
}

void CheckBoxDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const {
  if(index.isValid()&&index.column()== 9 ) {
    QString value=index.model()->data(index,Qt::DisplayRole).toString();
    QCheckBox *checkBox=static_cast<QCheckBox*>(editor);
    if (value=="true")
      checkBox->setCheckState(Qt::Checked);
    else
      checkBox->setCheckState(Qt::Unchecked);
  } else {
    QItemDelegate::setEditorData(editor,index);
  }
}

void CheckBoxDelegate::setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index) const {
  if(index.isValid()&&index.column()== 9 ) {
    QCheckBox *checkBox=static_cast<QCheckBox*>(editor);
    QString value;
    if (checkBox->checkState()==Qt::Checked)
      value="true";
    else
      value="false";
    model->setData(index,value);
  } else {
    QItemDelegate::setModelData(editor,model,index);
  }
}

void CheckBoxDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) const {
  if(index.isValid()&&index.column()== 9 )
    editor->setGeometry(option.rect);
  else
    QItemDelegate::updateEditorGeometry(editor,option,index);
}

И вставляю его в QTableView :

Код: plaintext
1.
CheckBoxDelegate *delegate=new CheckBoxDelegate;
mainWindow.table_main->setItemDelegate(delegate);

Но при этом чекбокс появляется только при двойном клике на ячейку и true/false не исчезают. Подскажите, как переделать чтобы отображался только чекбокс? Или может есть более рациональные методы?
...
Рейтинг: 0 / 0
09.01.2010, 15:38
    #36401589
skmdeveloper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
1. Чтобы редактировать после одного щелчка в конструктор QTabelView добавляем сточку
Код: plaintext
connect(this,SIGNAL(activated(QModelIndex)),this,SLOT(edit(QModelIndex)));

2. Отображать виджет в таблице слишком ресурсоемко. Лучше переопределить в модели функцию data. Например я отображаю "x" для true.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
QVariant QMyModel::data(const QModelIndex& index, int role) const {
    if (index.isValid()) {
        if (role == Qt::DisplayRole) {
            bool a = getValue(...); // здесь получаем данные
            return  a ? QString("x") : QString();
        }
    }
    ......
}
...
Рейтинг: 0 / 0
09.01.2010, 17:32
    #36401679
Viper360
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
skmdeveloper , большое спасибо за ответ! Но я хотел бы узнать как реализуется сам чекбокс без отображения текста под ним? На форме управления профилями программы Konsole в KDE 4.x.x реализовано как раз то, чего я хочу достичь (колонка только с чекбоксами). Но не совсем ясно в какую сторону копать для получения такого результата?
...
Рейтинг: 0 / 0
09.01.2010, 22:10
    #36401845
skmdeveloper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
В QTableWidget в ячейку можно установить виджет http://qt.nokia.com/doc/4.6/qtablewidget.html#setCellWidget

В QTableView ничего подобного, кажется, нет.
...
Рейтинг: 0 / 0
10.01.2010, 00:05
    #36401969
trdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
Viper360 skmdeveloper , большое спасибо за ответ! Но я хотел бы узнать как реализуется сам чекбокс без отображения текста под ним? На форме управления профилями программы Konsole в KDE 4.x.x реализовано как раз то, чего я хочу достичь (колонка только с чекбоксами). Но не совсем ясно в какую сторону копать для получения такого результата?
Можно через модель, обрати внимание на (Qt::CheckStateRole):
http://doc.crossplatform.ru/qt/4.5.0/qt.html#ItemDataRole-enum
работать надо через перегрузку:
QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole )
...
Рейтинг: 0 / 0
10.01.2010, 14:44
    #36402328
Viper360
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
trdmViper360 skmdeveloper , большое спасибо за ответ! Но я хотел бы узнать как реализуется сам чекбокс без отображения текста под ним? На форме управления профилями программы Konsole в KDE 4.x.x реализовано как раз то, чего я хочу достичь (колонка только с чекбоксами). Но не совсем ясно в какую сторону копать для получения такого результата?
Можно через модель, обрати внимание на (Qt::CheckStateRole):
http://doc.crossplatform.ru/qt/4.5.0/qt.html#ItemDataRole-enum
работать надо через перегрузку:
QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole )

Да, это именно то что мне нужно! Но осталась последняя проблема : Qt::CheckStateRole создает чекбокс по левому краю ячейки. Вычитал что решить проблему (выровнять по центру) можно с помощью делегата и обьявления своего ItemDataRole, но как это делать на практике? Если у кого есть пример, не могли бы поделиться?
...
Рейтинг: 0 / 0
15.01.2010, 16:51
    #36412850
Viper360
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
Ничего не удается найти по данному вопросу. Может кто-то подскажет в каком хоть направлении двигаться?
...
Рейтинг: 0 / 0
17.01.2010, 19:48
    #36414759
Viper360
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
Хух, разобрался) Вот, может кому понадобиться : тынц
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
18.11.2012, 22:52
    #38043444
Alca
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
авторХух, разобрался) Вот, может кому понадобиться : тынц
ссылка на тыц не работает
...
Рейтинг: 0 / 0
07.12.2012, 23:04
    #38070616
Senia_Bezrubashkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
Alca,
я так понял, речь идет об этом примере http://doc.qt.digia.com/4.5/itemviews-spinboxdelegate.html
Его просто переделывают... вместо spinboxdelegate подставляют checkboxdelegate
...
Рейтинг: 0 / 0
07.12.2012, 23:12
    #38070624
Senia_Bezrubashkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBox в QTableView
Ну, и везде где есть SpinBox заменяем на CheckBox.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / CheckBox в QTableView / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]