Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ivans от Февраль 06, 2007, 10:31



Название: Выделить строку в QTableView
Отправлено: ivans от Февраль 06, 2007, 10:31
Здравствуйте! Можно ли выделить (подсветить фон, сменить шрифт usw.) строку в QTableView в зависимости от входных данных? У меня есть модель  производная от QAbstractListModel. Модель содержит набор некоторых структур,  часть полей у которых отображается в виде столбцов таблицы.  Одно из полей представляет собой пометку, в зависимости от состояния которой мне хотелось бы изменять внешний вид строки, отображающей данную структуру - при этом я не хочу использовать установку selection. Может быть как то можно добраться до widget, реализующего строку в целом или отдельные ячейки строки?


Название: Выделить строку в QTableView
Отправлено: goer от Февраль 06, 2007, 18:15
Ну на самом деле установка типа выделения (setSelectionMode()) для того и предназначена, чтоб решить твою проблему. Если же ты не хочешь ее использовать, то она по видимому вызывает какой то побочный эффект? Может поделишься неприятностями использования установки selection и мы попытаемся устранить их причину, чтоб не изобретать велосипед заново....


Название: Выделить строку в QTableView
Отправлено: ivans от Февраль 06, 2007, 20:52
Цитата: "goer"
Ну на самом деле установка типа выделения (setSelectionMode()) для того и предназначена, чтоб решить твою проблему. Если же ты не хочешь ее использовать, то она по видимому вызывает какой то побочный эффект? Может поделишься неприятностями использования установки selection и мы попытаемся устранить их причину, чтоб не изобретать велосипед заново....

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


Название: Выделить строку в QTableView
Отправлено: bigirbis от Февраль 06, 2007, 22:10
Доверни метод QAbstractItemModel::data()
обработай Qt::FontRole, Qt::BackgroundRole, Qt::ForegroundRole


Название: Выделить строку в QTableView
Отправлено: ivans от Февраль 07, 2007, 00:12
Цитата: "bigirbis"
Доверни метод QAbstractItemModel::data()
обработай Qt::FontRole, Qt::BackgroundRole, Qt::ForegroundRole

Да! Да!!! Мне пора на пенсию!
Ведь я буквально пару дней назад когда делал модель, читал про эти роли и думал: шикарно - внешним видом можно рулить как угодно!
:-D
СПАСИБО!


Название: Выделить строку в QTableView
Отправлено: QCasper от Февраль 07, 2007, 02:35
Кстати меня давно мучает вопрос, как сделать чтобы по клику на одну ячейку выделялась вся строка?


Название: Выделить строку в QTableView
Отправлено: Вячеслав от Февраль 07, 2007, 09:11
Цитата: "QCasper"
Кстати меня давно мучает вопрос, как сделать чтобы по клику на одну ячейку выделялась вся строка?

void setSelectionBehavior ( QAbstractItemView::SelectionBehavior behavior ) ?


Название: Выделить строку в QTableView
Отправлено: QCasper от Февраль 07, 2007, 12:49
Именно, спасибо!


Название: Re: Выделить строку в QTableView
Отправлено: igmush от Февраль 15, 2010, 16:13
Доверни метод QAbstractItemModel::data()
обработай Qt::FontRole, Qt::BackgroundRole, Qt::ForegroundRole
Помогите, пожалуйста, "довернуть" метод. Мне понятно как "подсветить" саму ячейку с отрицательным(или каким-либо другим) значением, но непонятно как подсветить весь ряд на основе анализа значения одной ячейки. Наверное, я туплю, но хоть убейте не пойму, как проверить значение не текущей колонки, а конкретной колонки в этом же ряду.
Спасибо заранее.


Название: Re: Выделить строку в QTableView
Отправлено: Kolobok от Февраль 15, 2010, 17:30
Помогите, пожалуйста, "довернуть" метод. Мне понятно как "подсветить" саму ячейку с отрицательным(или каким-либо другим) значением, но непонятно как подсветить весь ряд на основе анализа значения одной ячейки. Наверное, я туплю, но хоть убейте не пойму, как проверить значение не текущей колонки, а конкретной колонки в этом же ряду.
Спасибо заранее.

Код:
QVariant	data ( const QModelIndex & index, int role )
  {
    ...
      if( role == Qt::BackgroundColorRole )
      {
        QModelIndex controlIndex = index.sibling( index.row(), конкретная_колонка );
        return ( controlIndex.data( Qt::DisplayRole ).toInt() == -1 ) ? QColor( Qt::red ) : QVariant();
      }
  }


Название: Re: Выделить строку в QTableView
Отправлено: igmush от Февраль 16, 2010, 07:56
Спасибо огромное!  :D


Название: Re: Выделить строку в QTableView
Отправлено: SABROG от Февраль 16, 2010, 09:18
Как я понял с помощью style sheet можно обработать hover только одной ячейки, т.е. строку подсветить при наведении мыши уже не получиться с помощью стилей?


Название: Re: Выделить строку в QTableView
Отправлено: Danila_Bagrofff от Август 10, 2011, 14:56
А как программно установить выделение строки?

Вот нужно по нажатию, чтобы сделались активными(выделенными) определенные строки.

Работаю с QTableView. Как это сделать?

Код:
qTblVwSearchDocs->setSelectionMode(QAbstractItemView::ContiguousSelection);
    qTblVwSearchDocs->setSelectionBehavior(QAbstractItemView::SelectRows);
    connect(qTblVwSearchDocs, SIGNAL(doubleClick(QModelIndex)),
            this, SLOT(searchDocEnter(QModelIndex)));
    connect(qTblVwSearchDocs, SIGNAL(pressClick(QModelIndex)),
            this, SLOT(checkDoc(QModelIndex)));


TableView::TableView(QWidget *parent) : QTableView(parent)
{

}

void TableView::mouseDoubleClickEvent ( QMouseEvent *event )
{
    emit(doubleClick(this->indexAt(QPoint(event->pos().x(), event->pos().y()))));
    this->selectRow(this->currentIndex().row());
    event->accept();
}


void TableView::mousePressEvent(QMouseEvent *event )
{
    if(event->button() == Qt::RightButton)
    {
        event->accept();
        return;
    }
    emit(pressClick(this->indexAt(QPoint(event->pos().x(), event->pos().y()))));
    event->accept();
}

Судя по всему из-за преопределенных функций бага с выделением...


Название: Re: Выделить строку в QTableView
Отправлено: Danila_Bagrofff от Август 10, 2011, 15:38
Все, понял, надо нормально переопределить и правильно указать строку =)

Код:
void TableView::mouseDoubleClickEvent ( QMouseEvent *event )
{
    emit(doubleClick(this->indexAt(QPoint(event->pos().x(), event->pos().y()))));
    this->selectRow(this->indexAt(QPoint(event->pos().x(), event->pos().y())).row());
    event->accept();
}


void TableView::mousePressEvent(QMouseEvent *event )
{
    if(event->button() == Qt::RightButton)
    {
        event->accept();
        return;
    }
    emit(pressClick(this->indexAt(QPoint(event->pos().x(), event->pos().y()))));
    this->selectRow(this->indexAt(QPoint(event->pos().x(), event->pos().y())).row());
    event->accept();
}