![]() |
|
![]() ![]() ![]() |
|
Programister0 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
вот и весь вопрос !
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
Насчёт выделения строки копай в setSelectionModel().
Получение текущей позиции курсора - modelIndex() |
|||
|
||||
Programister0 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
спасибо вроде с выделением строк разобрался:
setSelectionBehavior( QAbstractItemView::SelectRows ); а вот с определением позиции курсора нет, надо определять позицию при её изменении методы: activated, entered, pressed, clicked - неподходят - они срабатывают на enter или click а надо на реагировать на перемещение курсора. |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
похоже, действительно, что встроенного события на "просто перемещение" с клавиатуры нет. Попробуй на всякий случай половить "entered", если нет, тогда, наверное, придётся самому ловить события клавиатуры влево-вправо/вверх-вниз. |
|||
|
||||
Programister0 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
все keyPressEvent ( QKeyEvent * event ) в секции и [virtual protected] как можно ещё отловить эти события? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
||||
|
||||
Programister0 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
блин для этого придется создавать свой класс от QTableView, можно как нибудь по другому?
Это сообщение отредактировал(а) Programister0 - 2.12.2007, 20:08 |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
Гхм, Programister0, а чем не подходят слоты selectionChanged и currentChanged? Местоположения курсора можно изменить многими способами(в т.ч. вообще программно) и, мне кажется, что лучше не использовать такие ограниченные решения, как перехват "всех" возможных способов изменения.
Добавлено через 2 минуты и 5 секунд Можно создать свой класс, унаследованный от QTableView, вывести наружу сигналы, и потом пользоваться им как-будто ничего для него писать и не приходилось ![]() -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Наследуемся от QTableView, переопределяем void QAbstractItemView::currentChanged (const QModelIndex & current, const QModelIndex & previous) (протектед слот).
|
|||
|
||||
Programister0 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
да варианты с selectionChanged и currentChanged намного привлекательнее, но все равно требуют написания своего класса от QTableView, это накладно и неудобно, было-бы проще что-то что не требует создания класса
|
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Programister0 |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
спасибо, все работает
но, тот вариант который вы написали моему компилятору непонравился:
но после удаления строк:
все пошло как по часам, я соединил сигнал и свою функцию:
теперь itemChange вызывается всегда когда курсор меняет положение, но теперь я непонимаю как и откуда это все берется? ведь сигнал currentChanged нигде не описан, только в Protected Slots; и где можно узнать какие ещё функции можно записать в signals? |
||||||
|
|||||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
||||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
В Qt Assistant, обычно раздел называется "List of All Members for [имя_класса]". Для твоего: "List of All Members for QTableWidget". Обычно в описании каждого класса есть ссылка типа "List of all members, including inherited members". А вообще currentChanged слот унаследованного класса QAbstractItemView и этот класс используется не только в QTableWidget. Т.ч. можно спокойно ничего не наследовать и использовать простой вариант, скажем для model based контролов:
|
||||
|
|||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
Ну, да, не надо было с одним и тем же именем делать... Одного я правда не понял: т.е. после удаления ключевых строк у тебя всё заработало? ![]() Кто-нибудь из знатоков Qt может объяснить это(к сожалению, сейчас нет времени разбираться)? -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Programister0 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
да все отлично работает,
но вообще непонимаю как, и откуда это все берется вот currentChanged была в Protected Slots а здесь её используем как SIGNAL нигде о такой возможности в Assisten'те не написано, какие ещё функции можно использовать как сигналы? как это определить? Это сообщение отредактировал(а) Programister0 - 5.12.2007, 02:53 |
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Я так понимаю разница в том, что производному классу доступны protected методы, а в connect не происходит прямого доступа к защищенному методу, только лишь его описание, прототип. Вызов защищенного слота происходит уже внутри класса (как и положено) QTableView/Widget.
|
||||
|
|||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
SABROG, да при чём тут private/protected
![]() -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Дык уже ответили человеку тут
Не надо путать сигналы со слотами. Сигналы "испускают" сами классы, нам не надо их звать, они сами придут. А чтобы мы узнали о их приходе нам надо повесить на дверь звонок в виде слота. А то уйдет сигнал вместе с бутылкой пива (параметром) так и не услышанным. Собственноручно сигналы надо писать только в том случае, если создаем новый класс или модифицируем старый так, чтобы он сообщал о каком-то новом действии, которого не реализовали. Например для QLineEdit можно придумать сигнал, который прийдет если текстовое поле стало пустым, чтобы сделать неактивной кнопку "OK", если продолжение программы невозможно без ввода каких-нибудь данных, скажем серийного кода. Правда пример не очень хороший, т.к. сигнала textChanged вполне хватит на проверку пустоты. Чтобы не быть голословным, пример на базе класс QItemSelectionModel. Класс испускает сигнал currentChanged, если удаляет, вставляет строки и т.д.
Это сообщение отредактировал(а) SABROG - 5.12.2007, 16:08 |
|||
|
||||
archimed7592 |
|
||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
SABROG, Вы, скорее всего, не совсем верно меня поняли, или, может быть, читали ветку через строку
![]() Да я то, к слову, и не путаю - потому мне и не понятна сложившаяся ситуация ![]()
Да. Только маленькая поправочка, а точнее две: 1. сигналы испускают не классы, а объекты. 2. они испускают только сигналы, зарегестрированные в метаобъектной системе Qt. SABROG, хорошо, теперь скажите мне на основании всего что Вы написали, откуда в этом классе взялся сигнал currentChanged? Обратите внимание: 1. Речь о классе QTableView. 2. В классе QTableView нет сигнала currentChanged. 3. Programister0 выкинул из моего примера строки:
4. Ему якобы удалось соеденить с несуществующим сигналом какой-то слот и, якобы, он работает:
Собственно, если поверить Programister0 на слово и выкинуть из 4-го пункта слова "якобы", то получается нечто, мне не понятное. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||||
|
|||||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Под ООП в С++ я всегда подразумевал классы. Т.е. объектно ориентированное программирование - объект = класс.
Ну тогда стоит еще одно уточнение сделать, каждый объект на базе класса QObject. А таких там большинство. Слот currentChanged там есть. А вот сигнала я такого тоже не нашел. Либо у него на самом деле ничего не работает, либо у нас разные версии Qt ;) |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
Что ж, раз по делу сказать нечего, то могу только лишь порекомендовать в будущем читать топики внимательней, особенно, если собираетесь в них отвечать
![]() -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Пока автор не выложит исходники конечного рабочего варианта гадать бессмысленно. Но я так понял он нашел для себя ответ и тема ему больше не интересна.
Если смотреть исходный код QAbstractItemView (базовый класс для QTableView), то переопределенный currentChanged слот начнет срабатывать после вызова setModel. И тогда этот код будет рабочим без определения своего сигнала в таком виде:
|
|||
|
||||
Programister0 |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
эта тема мне ещё интересна, я пока непонимаю откуда берутся сигналы типа: currentChanged, и
это в самом начале написал archimed7592 и оно работает хоть он в это и не верит:
далее в своих производных от Ui_* классах прописываю коннект:
и myTable1Change - срабатывает как только меняется тек-я поз-я курсора! Это сообщение отредактировал(а) Programister0 - 5.12.2007, 23:40 |
||||||||||
|
|||||||||||
archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
Вообще говоря, идея заключалась как раз таки в том, чтобы добавить сигнал и забыть о слове "наследование", а никак не наоборот.
А чуть выше ты говорил про совсем другие строки. Что ж... Теперь всё понятно ![]() -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||
|
|||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
"Безнаследственный" вариант я написал на первой странице. А вот кто пускает сигнал currecntChanged я так и не понял, если его нет в производных классах и он не переопределяется.
Если только каким-то странным образом слот currentChanged не превратился в сигнал. Это сообщение отредактировал(а) SABROG - 6.12.2007, 16:43 |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
Так и есть ![]() -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Только это идеологически нехорошо ![]()
С точки зрения прямого чтения доков (о, как!) - возможно и первое ![]() Наиболее правильный вариант - называть сигнал по-другому... Другой вариант (решает проблему 1, но никак не 2 ![]() |
|||
|
||||
Mnior |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 30.1.2007 Репутация: нет Всего: нет |
Прикольный баг, перенести функцию из slot в signal
![]() Интересно, а что если после переноса в сигналы сделать енто:
![]() Да и вообще эта вся метаструктура в QT контролирует, что подаётся в slot() и signal(), а может там обыкновена функция и даже может и не бублик? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |