Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Evgeniya от Декабря 17, 2009, 21:02



Название: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 17, 2009, 21:02
Здраствуйте!!!
Есть таблица tableView, к ячейкам этой таблицы хочу добавить подсказку с содержимым ячейки на которую навели мышкой....как можно это организовать?


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 17, 2009, 22:12
Получилось....только вот как бы сделать,так,чтобы tooltip вызывался бы только если текст не поместился в ячейке,а не на каждой ячейке
Код
C++ (Qt)
class Model : public QSqlQueryModel
{
   Q_OBJECT
 
public:
    Model(QWidget *parent=0):QSqlQueryModel(parent){}
   ~Model(){}
   QVariant data(const QModelIndex &index,int role = Qt::DisplayRole) const{
       QVariant value = QSqlQueryModel::data(index, role);
        switch (role){
            case Qt::ToolTipRole:
                 return(QSqlQueryModel::data(index));
        }
       return value;
   }
};
 


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 18, 2009, 08:10
Или может,кто-нить подскажет как организовать перенос именно слов в ячейке...
При использовании функции resizeRowsToContents идет перенос по словам,а не слов.. Т.е. если слишком длинное слово,то оно не переносится и его не видно...


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: voronElf от Декабря 18, 2009, 11:07
Подозреваю что и в одном и в другом случае нужно копать в сторону делегатов. Жаль что ничего определенного не могу сказать

PS: насчет переноса в словах - эт же подцеплять нужно правила переноса слов языка локализации (для нас - русского)


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 18, 2009, 11:34
спасибо за ответ...буду пробовать ;-))


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 20, 2009, 17:40
Можно еще вопросик...
Можно ли мне вызвать эту всплывающую подсказку с помощью метода setData,указав в качестве роли Qt::ToolTipRole???
Просто я делаю вот так:
Код
C++ (Qt)
QString sql="запрос";
QSqlQueryModel *mod= new QSqlQueryModel();
mod->setQuery(sql);
for(int i=0;i<mod->rowCount();i++)
mod->setData(mod->index(i,2), mod->data(mod->index(i,2)),Qt::ToolTipRole);
ui.tableView->setModel(mod);
 
только почему-то не появляется всплывающая посказка в 3 столбце...или все-таки я не правильно делаю??


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: MoPDoBoPoT от Декабря 20, 2009, 19:00
QSqlQueryModel только для чтения, то есть метод setData() ничего не делает. Можно отнаследоваться от QSqlQueryModel и переопределить метод data(). Получится почти также, как ты делала до этого, только с проверкой на 3-й столбец:
Код
C++ (Qt)
QVariant Model::data(const QModelIndex &index, int role /*= Qt::DisplayRole*/) const
{
   if (index.column() == 2 && role == Qt::ToolTipRole)
        return QSqlQueryModel::data(index, Qt::DisplayRole);
 
   return QSqlQueryModel::data(index, role);
}
 


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 21, 2009, 07:13
MoPDoBoPoT, спасибо!!!
А для чего тогда нужен этот метод???В какой момент он срабатывает????


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Пантер от Декабря 21, 2009, 07:16
Этот метод нужен, чтобы ты его переопределила.


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Dendy от Декабря 21, 2009, 07:23
А для чего тогда нужен этот метод???В какой момент он срабатывает????

Пользователь наводится мышкой на ячейку, задерживается на ней -> Qt посылает во View событие QEvent::ToolTip -> View смотрит на какую ячейку наведена мышка и вызывает QAbstractItemModel::data( index, Qt::ToolTipRole ) -> Модель возвращает данные (в вашем случае - строку, совпадающую со значением в ячейке), которые View и показывает.


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 21, 2009, 07:35
Спасибо,большое за такое подробное объяснение...
Просто хочется найти способ,чтобы tooltip вызывался в самой программе при выполнении определенного условия,связанного с tableView,а не в переопределенном методе QSqlQueryModel,где нельзя добавить такого условия..


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Dendy от Декабря 21, 2009, 07:59
Если нужно, чтобы работало и стандартное поведение (при задержке мышкой) и ваше, и причём работало оно одинаково - лучше просто отправлять во вьюв такое же событие, к примеру:

Код
C++ (Qt)
void MyWindow::hotKeyTriggered()
{
   const QModelIndex index = ...;
   const QPoint pos = view->visualRect( index ).center();
   QHelpEvent helpEvent( QEvent::ToolTip, pos, view->viewport()->mapToGlobal( pos ) )
   QCoreApplication::sendEvent( view->viewport(), &helpEvent );
}

Также можно взять у вьюв делегата и вызвать ему QAbstractItemDelegate::helpEvent().


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 21, 2009, 09:37
Dendy,спасибо большое!!!!
Я вот решила сделать вот таким образом
Код
C++ (Qt)
bool event(QEvent *event)
{
if(event->type()==QEvent::ToolTip)
 {
  QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
  QModelIndex Cursor=ui.tableView->indexAt(helpEvent->pos());
    QString ToolTipText=model->data(model->index(Cursor.row(),Cursor.column())).toString();
    if(!ToolTipText.isEmpty())
      QToolTip::showText(helpEvent->globalPos(), ToolTipText);
}
return QWidget::event(event);
}

правда почему-то подсказка показывает ячейку на 3 строчки ниже...
т.е. получается,что у меня не так считается QModelIndex Cursor...Как его правильно посчитать???


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Dendy от Декабря 21, 2009, 16:28
Переопределяйте не event(), а viewportEvent(). И возвращайте true, если обработали QEvent::ToolTip, иначе сработает ещё и стандартный обработчик.


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 22, 2009, 08:17
Спасибо большое!!!!Я так и сделала...теперь все нормально работает  :)


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Evgeniya от Декабря 22, 2009, 08:55
только вот единственная проблемка...я же подсказку вывожу при удвлетворении определенного условия...и если перевожу с одной ячейки на другую которая так же удовлетворяет этому условию,то она нормально быстро меняется,а если перевожу на ячейку где мне не нужно выводить эту подсазку - подсказка долго зависает над предыдущей ячейкой....т.е. ее нужно как-то убирать в этом случае


Название: Re: подсказка с содержимым ячейки в tableView
Отправлено: Dendy от Декабря 22, 2009, 16:42
Для такой ячейки вызывайте: QToolTip::hideText()