Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: thechicho от Январь 06, 2012, 22:11



Название: QTableWidget + checked
Отправлено: thechicho от Январь 06, 2012, 22:11
в таблице есть итемы с чекбоксом.
хотел добавить, чтобы они отмечались при нажатии на сам текст итема.

connect(ui->tableWidgetBeeline, SIGNAL(itemPressed(QTableWidgetItem*)), this, SLOT(checkedItem(QTableWidgetItem*)));

void Mobiler::checkedItem(QTableWidgetItem* item)
{
    if (item->checkState() == 0)
        item->setCheckState(Qt::Checked);
    else
        item->setCheckState(Qt::Unchecked);
}

но при таком раскладе, если нажимаю на сам чекбокс, то срабатывает коннект, т.е. допустим галочка ставится и одновременно срабатывает стандартный для чекбокса сигнал (или хз чо), т.е. галочка убирается.
как можно сделать, чтобы и при нажатии на текст итема, происходило изменение состояния, и при нажатии на сам чекбокс?


Название: Re: QTableWidget + checked
Отправлено: andrew.k от Январь 07, 2012, 00:26
Что за манера менять стандартное поведение?

По щелчку айтем выделяется. Может использовать это?
Но опять же возникают вопросы, при нажатии например стрелок тоже будет меняться выделение. Подозреваю, что в этом случае уже не должен ставиться чекбокс по "задумке".

Можно еще посмотреть в сторону currentItem. Но наверное с ним ситуация будет схожа с выделением.

Видимо в итоге придется переопределять mousePressEvent и там смотреть куда тыкнул пользователь (itemAt) и решать надо ставить чекбокс или нет.


Название: Re: QTableWidget + checked
Отправлено: thechicho от Январь 07, 2012, 17:37
// Что за манера менять стандартное поведение?
дак лучше же, когда на текст нажимаешь и чекбокс отмечается, чем выцеливать каждый раз его, чтобы отметить.
// По щелчку айтем выделяется. Может использовать это?
connect(ui->tableWidgetBeeline, SIGNAL(itemPressed(QTableWidgetItem*)), this, SLOT(checkedItem(QTableWidgetItem*)));
// Но опять же возникают вопросы, при нажатии например стрелок тоже будет меняться выделение
выделение тут не при делах. чекбоксы будут отмечаться только при нажатии (мышка || пробел)

короче, почитал setFlags()
выяснил, что на возможность отмечать чекбокс влияет флаг
Qt::ItemIsUserCheckable   16   It can be checked or unchecked by the user.
просто установил нужные флаги, без него.
таким образом, состояние меняется только в слоте, как мне и надо было *fuck yeah*

Код
C++ (Qt)
void Mobiler::checkItem(QTableWidgetItem* item)
{
   if (item->checkState() == 0 && item->column() == 0)
       item->setCheckState(Qt::Checked);
   else if (item->checkState() == 2 && item->column() == 0)
       item->setCheckState(Qt::Unchecked);
}
 
       for (int i = 0; i < phonesBeeline.count(); i++) {
           QTableWidgetItem *item = new QTableWidgetItem(phonesBeeline[i]);
           item->setCheckState(Qt::Checked);
           item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
           itemsPhonesBeeline << item;
           ui->tableWidgetBeeline->setItem(i, 0, item);
 
           QTableWidgetItem *itemBalanse = new QTableWidgetItem;
           QTableWidgetItem *itemStatus = new QTableWidgetItem;
           itemBalanse->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
           itemStatus->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
           ui->tableWidgetBeeline->setItem(i, 1, itemBalanse);
           ui->tableWidgetBeeline->setItem(i, 2, itemStatus);
           itemsBalanseBeeline << itemBalanse;
           itemsStatusBeeline << itemStatus;
       }