powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CheckBox в QTableView
11 сообщений из 11, страница 1 из 1
CheckBox в QTableView
    #36401528
Фотография Viper360
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток! Пытаюсь 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
CheckBox в QTableView
    #36401589
skmdeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
CheckBox в QTableView
    #36401679
Фотография Viper360
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skmdeveloper , большое спасибо за ответ! Но я хотел бы узнать как реализуется сам чекбокс без отображения текста под ним? На форме управления профилями программы Konsole в KDE 4.x.x реализовано как раз то, чего я хочу достичь (колонка только с чекбоксами). Но не совсем ясно в какую сторону копать для получения такого результата?
...
Рейтинг: 0 / 0
CheckBox в QTableView
    #36401845
skmdeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В QTableWidget в ячейку можно установить виджет http://qt.nokia.com/doc/4.6/qtablewidget.html#setCellWidget

В QTableView ничего подобного, кажется, нет.
...
Рейтинг: 0 / 0
CheckBox в QTableView
    #36401969
trdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
CheckBox в QTableView
    #36402328
Фотография Viper360
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
CheckBox в QTableView
    #36412850
Фотография Viper360
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не удается найти по данному вопросу. Может кто-то подскажет в каком хоть направлении двигаться?
...
Рейтинг: 0 / 0
CheckBox в QTableView
    #36414759
Фотография Viper360
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хух, разобрался) Вот, может кому понадобиться : тынц
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
CheckBox в QTableView
    #38043444
Alca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторХух, разобрался) Вот, может кому понадобиться : тынц
ссылка на тыц не работает
...
Рейтинг: 0 / 0
CheckBox в QTableView
    #38070616
Senia_Bezrubashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alca,
я так понял, речь идет об этом примере http://doc.qt.digia.com/4.5/itemviews-spinboxdelegate.html
Его просто переделывают... вместо spinboxdelegate подставляют checkboxdelegate
...
Рейтинг: 0 / 0
CheckBox в QTableView
    #38070624
Senia_Bezrubashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, и везде где есть SpinBox заменяем на CheckBox.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / CheckBox в QTableView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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