Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ QTableWidget с CheckBox'ом внутри

Автор: silver47 14.4.2011, 6:51

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

Я могу установить 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?

Автор: wiz29 14.4.2011, 8:30

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


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

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

Автор: silver47 14.4.2011, 8:32

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

А ты добавил элемент в таблицу? прежде чем его читать

Автор: silver47 14.4.2011, 8:37

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


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

Автор: wiz29 14.4.2011, 8:42

//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);


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

Автор: silver47 14.4.2011, 8:50

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


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


 

Автор: wiz29 14.4.2011, 8:59

там поправка в коде выше
pItem->setCheckState(Qt::Unchecked);

Автор: silver47 14.4.2011, 9:03

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

А на будущее, все же можно как то установить конкретный виджет для ячейки, а потом его получить с помощью cellWidget? Уж коли метод есть, то и как-то применяться он должен.

Автор: wiz29 14.4.2011, 9:08

    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);
    }

Можно и так

Автор: silver47 14.4.2011, 9:15

QCheckBox* pCheckB(qobject_cast<QCheckBox*>(pWidget->cellWidget(0, 0)));


Именно то, что нужно! Спасибо.

Автор: wiz29 14.4.2011, 9:17

ну если тебе только чекбокс нужно вставить, используй лучше метод с QTableWidgetItem

он гораздо понятнее

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)