Russian Qt Forum
Июня 02, 2025, 14:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: подсказка с содержимым ячейки в tableView  (Прочитано 13331 раз)
Evgeniya
Гость
« : Декабря 17, 2009, 21:02 »

Здраствуйте!!!
Есть таблица tableView, к ячейкам этой таблицы хочу добавить подсказку с содержимым ячейки на которую навели мышкой....как можно это организовать?
Записан
Evgeniya
Гость
« Ответ #1 : Декабря 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;
   }
};
 
Записан
Evgeniya
Гость
« Ответ #2 : Декабря 18, 2009, 08:10 »

Или может,кто-нить подскажет как организовать перенос именно слов в ячейке...
При использовании функции resizeRowsToContents идет перенос по словам,а не слов.. Т.е. если слишком длинное слово,то оно не переносится и его не видно...
Записан
voronElf
Гость
« Ответ #3 : Декабря 18, 2009, 11:07 »

Подозреваю что и в одном и в другом случае нужно копать в сторону делегатов. Жаль что ничего определенного не могу сказать

PS: насчет переноса в словах - эт же подцеплять нужно правила переноса слов языка локализации (для нас - русского)
Записан
Evgeniya
Гость
« Ответ #4 : Декабря 18, 2009, 11:34 »

спасибо за ответ...буду пробовать ;-))
Записан
Evgeniya
Гость
« Ответ #5 : Декабря 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 столбце...или все-таки я не правильно делаю??
Записан
MoPDoBoPoT
Гость
« Ответ #6 : Декабря 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);
}
 
Записан
Evgeniya
Гость
« Ответ #7 : Декабря 21, 2009, 07:13 »

MoPDoBoPoT, спасибо!!!
А для чего тогда нужен этот метод???В какой момент он срабатывает?Непонимающий
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Декабря 21, 2009, 07:16 »

Этот метод нужен, чтобы ты его переопределила.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Dendy
Гость
« Ответ #9 : Декабря 21, 2009, 07:23 »

А для чего тогда нужен этот метод???В какой момент он срабатывает?Непонимающий

Пользователь наводится мышкой на ячейку, задерживается на ней -> Qt посылает во View событие QEvent::ToolTip -> View смотрит на какую ячейку наведена мышка и вызывает QAbstractItemModel::data( index, Qt::ToolTipRole ) -> Модель возвращает данные (в вашем случае - строку, совпадающую со значением в ячейке), которые View и показывает.
Записан
Evgeniya
Гость
« Ответ #10 : Декабря 21, 2009, 07:35 »

Спасибо,большое за такое подробное объяснение...
Просто хочется найти способ,чтобы tooltip вызывался в самой программе при выполнении определенного условия,связанного с tableView,а не в переопределенном методе QSqlQueryModel,где нельзя добавить такого условия..
Записан
Dendy
Гость
« Ответ #11 : Декабря 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().
Записан
Evgeniya
Гость
« Ответ #12 : Декабря 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...Как его правильно посчитать???
Записан
Dendy
Гость
« Ответ #13 : Декабря 21, 2009, 16:28 »

Переопределяйте не event(), а viewportEvent(). И возвращайте true, если обработали QEvent::ToolTip, иначе сработает ещё и стандартный обработчик.
Записан
Evgeniya
Гость
« Ответ #14 : Декабря 22, 2009, 08:17 »

Спасибо большое!!!!Я так и сделала...теперь все нормально работает  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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