crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QTableWidget с CheckBox'ом внутри
silver47
  опции профиля:
сообщение 14.4.2011, 6:51
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Доброго времени суток. Вот такой вопрос.

Я могу установить QCheckBox для конкретной ячейки таблицы:
QTableWidget::setCellWidget(x, y, new QCheckBox)


Как мне прочитать его состояние? Есть такое QTableWidget::cellWidget(int x, int y); - возвращает указатель на виджет, расположенный в указанной ячейке. Как мне определить isCheked он или нет? для QWidget метод isCheked не определен. Если создать свой QCheckBox(QTableWidget::cellWidget(x, y)) и проверять его состояние, то он всегда false (потому что это уже другой объект QCheckBox (проверял по адресам)). А вот как сделать чтобы вновь созданный QCheckBox был ссылкой на старый? Не могу сообразить. :unsure:

Не хочу городить свою модель. Таблица не большая от 1 до 10 строчек.

Спасибо.

P.S. cellWidget(x, y) возвращает нужный мне указатель, только на тип QWidget, как бы его преобразовать к QCheckBox?

Сообщение отредактировал silver47 - 14.4.2011, 7:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 14.4.2011, 8:30
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


...............................
QTableWidget* pTableWidget(GetSomeTableWidget());
...............................................
QTableWidgetItem* pItem(pTableWidget->item(x, y));
if (pItem)
{
                //состояние чекбокса
        Qt::CheckState st = pItem->checkState();
}
...............................


Никаких виджетов устанавливать не нужно. Достаточно просто указать CheckState для элемента ячейки.

QTableWidgetItem::setFlags тебе поможет сделать элемент как чекбокс

Сообщение отредактировал wiz29 - 14.4.2011, 8:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 14.4.2011, 8:32
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


QTableWidget* pTableWidget(table);
QTableWidgetItem* pItem(pTableWidget->item(0, 0));
qDebug() << pItem;
if (pItem) {
    Qt::CheckState st = pItem->checkState();
}


table - это указатель на мой табличный виджет
pItem - всегда нулевой указатель :unsure:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 14.4.2011, 8:33
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


А ты добавил элемент в таблицу? прежде чем его читать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 14.4.2011, 8:37
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Цитата(wiz29 @ 14.4.2011, 10:33) *
А ты добавил элемент в таблицу? прежде чем его читать


Да. В конструкторе:
table->setCellWidget(0, 0, new QCheckBox);

Сообщение отредактировал silver47 - 14.4.2011, 8:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 14.4.2011, 8:42
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


//some part of code
.............................
QTableWidget* pSomeTable(GetSomeTable());
pSomeTable->setColumnCount(1);
pSomeTable->setRowCount(pSomeTable->rowCount() + 1);
QTableWidgetItem* pItem(new QTableWidgetItem(tr("blablabla")));
pItem->setFlags(pItem->flags() | Qt::ItemIsUserCheckable);
pItem->setCheckState(Qt::Unchecked);
pSomeTable->setItem(0, 0, pItem);
..............................
//in other place of code
QTableWidget* pTableWidget(GetSomeTable());
QTableWidgetItem* pItem(pTableWidget->item(0, 0));
if (pItem) {
    Qt::CheckState st = pItem->checkState();
}
...............................


Цитата(silver47 @ 14.4.2011, 9:37) *
Цитата(wiz29 @ 14.4.2011, 10:33) *
А ты добавил элемент в таблицу? прежде чем его читать


Да. В конструкторе:
table->setCellWidget(0, 0, new QCheckBox);


см пример выше.

Сообщение отредактировал wiz29 - 14.4.2011, 8:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 14.4.2011, 8:50
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


item = new QTableWidgetItem;
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
table->setItem(0, 0, item);


Нет Чекбокса:

Прикрепленные изображения
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 14.4.2011, 8:59
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


там поправка в коде выше
pItem->setCheckState(Qt::Unchecked);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 14.4.2011, 9:03
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Спасибо Работает.

А на будущее, все же можно как то установить конкретный виджет для ячейки, а потом его получить с помощью cellWidget? Уж коли метод есть, то и как-то применяться он должен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 14.4.2011, 9:08
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


    QTableWidget* pWidget(new QTableWidget);
    pWidget->setRowCount(1);
    pWidget->setColumnCount(1);
    pWidget->setCellWidget(0, 0, new QCheckBox(pWidget));
    pWidget->show();
    QCheckBox* pCheckB(qobject_cast<QCheckBox*>(pWidget->cellWidget(0, 0)));
    if (pCheckB)
    {
        pCheckB->setChecked(true);
    }

Можно и так
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.4.2021, 20:52