Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/20: Рейтинг темы: голосов - 20, средняя оценка - 4.75
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
1

Qt - Получить указатель на ячейку в QTableView

29.09.2011, 17:04. Просмотров 3544. Ответов 8
Метки нет (Все метки)

Доброго времени суток!

Пытаюсь программно выделить строку в QTableView, для этого посылаю сигнал о клике мыши. Только вот кому его посылать? Я уже кажется все перепробовал, порылся в исходниках Qt, пробовал тупо перебором - ничего не выходит. Максимум чего добился - это выделения "шапки" таблицы (QHeaderView). Пробовал программно кликать по всей области окна, строка не выделяеться.
Подскажите как такое можно реализовать?

P.S. нужно именно через отправку события мыши, не спрашивайте зачем, так надо)

Спасибо)

Добавлено через 2 минуты
да еще, у меня установлено выделение
C++
1
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
поэтому при клике на любой ячейке выделиться вся строка.
Поэтому и спрашиваю про указатель на ячеку (или что там)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2011, 17:04
Ответы с готовыми решениями:

Как из кода изменить ячейку в QTableView или QTableModel
Собственно вопрос весь в сабже. Добавлю, что создается QSQLTableModel, затем...

Как узнать значение первой ячейки в строке (QTableView) при нажатии на любую ячейку в строке?
Сразу извинюсь за корявость речи. Знатоки, подскажите, как узнать значение...

Получить значение ячейки QTableView
Здравствуйте, подскажите пожалуйста, как можно получить значение ячейки...

Таблица QTableview, необходимо получить из неё данные
QTableview - получить значение ячейки. QTableview - получить название...

Получить данные строки из QTableView по которой сделан двойной клик
То, что нужно переопределить событие в классе наследнике от QTableView я понял,...

8
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
29.09.2011, 18:41 2
а пробовал setRangeSelected
0
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
29.09.2011, 20:02  [ТС] 3
Чистый, setRangeSelected это член QTableWidget, а мне нужно QTableView.

Добавлено через 2 минуты
Насколько я разобрался, мне нужно работать с QTableView::viewport() (эта ф-ция унаследована от QAbstractScrollArea), она возаращает указатель на центральный виджет, т.е. на таблицу. А вот что дальше? Хотя не уверен, что нужен именно он.

Добавлено через 1 час 3 минуты
мне уже кажется, что это вообще не возможно...

вот один из многих вариантов, по-моему самый правильный
C++
1
2
3
4
5
6
7
8
9
 QTableView *ptv = (QTableView*)someWidget->currentWidget();//someWidget - наследник QTabWidget
  
    QWidget *pw= ptv->viewport();
    QPoint topLeft = pw->rect().topLeft();
   
    QMouseEvent *event = new QMouseEvent(QEvent::MouseButtonPress, topLeft, Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    QCoreApplication::postEvent(pw, event);
    event = new QMouseEvent(QEvent::MouseButtonRelease, topLeft, Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    QCoreApplication::postEvent(pw, event);
выделяется только QHeaderView. Может что-то не так?

Добавлено через 5 минут
во, заметил - строка выделяеться, только как то странно, более серым цветом, чем была. Хотя при клике мышью руками она становиться синей. WTF?
0
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
29.09.2011, 21:31 4
для изменения цвета, можно заюзать стили, серый вроятнее всего из за того что не активно...
1
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
30.09.2011, 04:06  [ТС] 5
Цитата Сообщение от Чистый Посмотреть сообщение
для изменения цвета, можно заюзать стили
Я думаю, что после нажатия на клетку менять программно ее цвет - это не выход)

Цитата Сообщение от Чистый Посмотреть сообщение
серый вроятнее всего из за того что не активно...
Хм, проверю.
0
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
30.09.2011, 09:48 6
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я думаю, что после нажатия на клетку менять программно ее цвет - это не выход)
Это конечно не выход, но это точно как вариант
0
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
30.09.2011, 18:28  [ТС] 7
Цитата Сообщение от Чистый Посмотреть сообщение
серый вроятнее всего из за того что не активно...
Проверил, окно активно. Более того - поставил глобальный фильтр событий, просто чтобы посмотреть что происходит. Так вот при клике мышью руками по ячейке таблицы и при программном клике, как я делаю, целевые объекты имеют один и тот же адрес и имя, т.е. я полностью имитирую действия пользователя (все таки я на правильном пути)). Но, блин, выделяеться серым цветом.
Может быть дело в пунктирной рамке вокруг ячейки? Когда кликаешь руками она автоматом устанавливается на ячейку (0,0) (т.е. верхнюю левую), а при программном клике этой рамки просто нет.
0
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
01.10.2011, 12:15 8
так может попробуй перед выделением поставить фокус на первую ячейку строки а потом эту строку выделять?
0
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
01.10.2011, 16:24  [ТС] 9
Да, я тоже так подумал) Попробовал setFocus(Qt::MouseFocusReason), что-то рантайм еррор какой-то странный и программа отваливается, хотя если заставить программу выполнится "на пинках" (в режиме отладки), то все работает как надо, т.е. устанавливается пунктирная рамка и строка выделяется синим цветом.
Не могу понять, с чем связанно?
Пробовал еще так:
C++
1
2
QFocusEvent *fevent = new QFocusEvent(QEvent::FocusIn,Qt::MouseFocusReason );
QCoreApplication::postEvent(some_ptr, fevent);
так почему-то фокус не устанавливаеться.

Добавлено через 4 минуты
события высылаю из другого потока, вот что появляеться в "консоли приложения" QtCreator
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 22fe48. Receiver 'qt_tabwidget_tabbar' (of type 'QTabBar') was created in thread 9517218", file c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qcoreapplication.cpp, line 349
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
полез в исходники...

Добавлено через 5 минут
Нашел в исходниках, вот откуда появляется эта ошибка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//qcoreapplication.cpp
void QCoreApplicationPrivate::checkReceiverThread(QObject *receiver)
{
    QThread *currentThread = QThread::currentThread();
    QThread *thr = receiver->thread();
    Q_ASSERT_X(currentThread == thr || !thr,
               "QCoreApplication::sendEvent",
               QString::fromLatin1("Cannot send events to objects owned by a different thread. "
                                   "Current thread %1. Receiver '%2' (of type '%3') was created in thread %4")
               .arg(QString::number((quintptr) currentThread, 16))
               .arg(receiver->objectName())
               .arg(QLatin1String(receiver->metaObject()->className()))
               .arg(QString::number((quintptr) thr, 16))
               .toLocal8Bit().data());
    Q_UNUSED(currentThread);
    Q_UNUSED(thr);
}
с чем это может быть связанно? Может нельзя вызывать методы объектов, созданных в другом потоке, а можно только посылать сообщения? (в multithreading я чайник)) Почему тогда сообщение QFocusEvent не устанавливает фокус ввода?

Добавлено через 19 минут
Проблему решил переместив setFocus() до клика под Tab'у. Теперь все нормально, хотя не понял с чем это связанно.
0
01.10.2011, 16:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2011, 16:24

Получить указатель на property?
У объектов могут быть динамические свойства. В частности, динамическим...

Как получить указатель на QString
И так вопрос: Я работаю с qt, и тут мне понадобилось получить адрес строки...

Получить указатель на окно верхнего уровня из другого класса
Всем привет! Могу путаться в терминологии, поправьте если что-) Необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru