Russian Qt Forum
Ноябрь 23, 2024, 22:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выделить строку в QTableView  (Прочитано 19357 раз)
ivans
Гость
« : Февраль 06, 2007, 10:31 »

Здравствуйте! Можно ли выделить (подсветить фон, сменить шрифт usw.) строку в QTableView в зависимости от входных данных? У меня есть модель  производная от QAbstractListModel. Модель содержит набор некоторых структур,  часть полей у которых отображается в виде столбцов таблицы.  Одно из полей представляет собой пометку, в зависимости от состояния которой мне хотелось бы изменять внешний вид строки, отображающей данную структуру - при этом я не хочу использовать установку selection. Может быть как то можно добраться до widget, реализующего строку в целом или отдельные ячейки строки?
Записан
goer
Гость
« Ответ #1 : Февраль 06, 2007, 18:15 »

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

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

Нет, просто selection я уже использую для других целей.  Мне нужно выделять некоторые записи дополнительно (и возможно одновременно с selection).
Записан
bigirbis
Гость
« Ответ #3 : Февраль 06, 2007, 22:10 »

Доверни метод QAbstractItemModel::data()
обработай Qt::FontRole, Qt::BackgroundRole, Qt::ForegroundRole
Записан
ivans
Гость
« Ответ #4 : Февраль 07, 2007, 00:12 »

Цитата: "bigirbis"
Доверни метод QAbstractItemModel::data()
обработай Qt::FontRole, Qt::BackgroundRole, Qt::ForegroundRole

Да! Да!!! Мне пора на пенсию!
Ведь я буквально пару дней назад когда делал модель, читал про эти роли и думал: шикарно - внешним видом можно рулить как угодно!
:-D
СПАСИБО!
Записан
QCasper
Гость
« Ответ #5 : Февраль 07, 2007, 02:35 »

Кстати меня давно мучает вопрос, как сделать чтобы по клику на одну ячейку выделялась вся строка?
Записан
Вячеслав
Гость
« Ответ #6 : Февраль 07, 2007, 09:11 »

Цитата: "QCasper"
Кстати меня давно мучает вопрос, как сделать чтобы по клику на одну ячейку выделялась вся строка?

void setSelectionBehavior ( QAbstractItemView::SelectionBehavior behavior ) ?
Записан
QCasper
Гость
« Ответ #7 : Февраль 07, 2007, 12:49 »

Именно, спасибо!
Записан
igmush
Гость
« Ответ #8 : Февраль 15, 2010, 16:13 »

Доверни метод QAbstractItemModel::data()
обработай Qt::FontRole, Qt::BackgroundRole, Qt::ForegroundRole
Помогите, пожалуйста, "довернуть" метод. Мне понятно как "подсветить" саму ячейку с отрицательным(или каким-либо другим) значением, но непонятно как подсветить весь ряд на основе анализа значения одной ячейки. Наверное, я туплю, но хоть убейте не пойму, как проверить значение не текущей колонки, а конкретной колонки в этом же ряду.
Спасибо заранее.
Записан
Kolobok
Гость
« Ответ #9 : Февраль 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();
      }
  }
Записан
igmush
Гость
« Ответ #10 : Февраль 16, 2010, 07:56 »

Спасибо огромное!  Веселый
Записан
SABROG
Гость
« Ответ #11 : Февраль 16, 2010, 09:18 »

Как я понял с помощью style sheet можно обработать hover только одной ячейки, т.е. строку подсветить при наведении мыши уже не получиться с помощью стилей?
Записан
Danila_Bagrofff
Гость
« Ответ #12 : Август 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();
}

Судя по всему из-за преопределенных функций бага с выделением...
« Последнее редактирование: Август 10, 2011, 15:33 от Danila_Bagrofff » Записан
Danila_Bagrofff
Гость
« Ответ #13 : Август 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();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 21.