Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] QtableView выделение всей строки |
Автор: Programister0 2.12.2007, 15:00 |
вот и весь вопрос ! |
Автор: JackYF 2.12.2007, 15:04 |
Насчёт выделения строки копай в setSelectionModel(). Получение текущей позиции курсора - modelIndex() |
Автор: Programister0 2.12.2007, 16:01 |
спасибо вроде с выделением строк разобрался: setSelectionBehavior( QAbstractItemView::SelectRows ); а вот с определением позиции курсора нет, надо определять позицию при её изменении методы: activated, entered, pressed, clicked - неподходят - они срабатывают на enter или click а надо на реагировать на перемещение курсора. |
Автор: Programister0 2.12.2007, 18:23 | ||
все keyPressEvent ( QKeyEvent * event ) в секции и [virtual protected] как можно ещё отловить эти события? |
Автор: JackYF 2.12.2007, 19:02 | ||
а зачем "ещё"? так и лови. |
Автор: Programister0 2.12.2007, 20:08 |
блин для этого придется создавать свой класс от QTableView, можно как нибудь по другому? |
Автор: archimed7592 2.12.2007, 20:08 |
Гхм, Programister0, а чем не подходят слоты http://doc.trolltech.com/qabstractitemview.html#selectionChanged и http://doc.trolltech.com/qabstractitemview.html#currentChanged? Местоположения курсора можно изменить многими способами(в т.ч. вообще программно) и, мне кажется, что лучше не использовать такие ограниченные решения, как перехват "всех" возможных способов изменения. Добавлено через 2 минуты и 5 секунд Можно создать свой класс, унаследованный от QTableView, вывести наружу сигналы, и потом пользоваться им как-будто ничего для него писать и не приходилось ![]() |
Автор: Любитель 2.12.2007, 20:11 |
Наследуемся от QTableView, переопределяем void QAbstractItemView::currentChanged (const QModelIndex & current, const QModelIndex & previous) (протектед слот). |
Автор: Programister0 2.12.2007, 20:31 |
да варианты с selectionChanged и currentChanged намного привлекательнее, но все равно требуют написания своего класса от QTableView, это накладно и неудобно, было-бы проще что-то что не требует создания класса |
Автор: archimed7592 2.12.2007, 20:44 | ||
|
Автор: Programister0 3.12.2007, 11:03 | ||||||
спасибо, все работает но, тот вариант который вы написали моему компилятору непонравился:
но после удаления строк:
все пошло как по часам, я соединил сигнал и свою функцию:
теперь itemChange вызывается всегда когда курсор меняет положение, но теперь я непонимаю как и откуда это все берется? ведь сигнал currentChanged нигде не описан, только в Protected Slots; и где можно узнать какие ещё функции можно записать в signals? |
Автор: JackYF 3.12.2007, 11:14 | ||||
так это слот, а не сигнал ![]()
ты сам можешь создавать сигналы |
Автор: SABROG 3.12.2007, 14:17 | ||||
В 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 4.12.2007, 17:59 |
Ну, да, не надо было с одним и тем же именем делать... Одного я правда не понял: т.е. после удаления ключевых строк у тебя всё заработало? ![]() Кто-нибудь из знатоков Qt может объяснить это(к сожалению, сейчас нет времени разбираться)? |
Автор: Programister0 4.12.2007, 23:58 |
да все отлично работает, но вообще непонимаю как, и откуда это все берется вот currentChanged была в Protected Slots а здесь её используем как SIGNAL нигде о такой возможности в Assisten'те не написано, какие ещё функции можно использовать как сигналы? как это определить? |
Автор: SABROG 5.12.2007, 12:00 | ||||
Я так понимаю разница в том, что производному классу доступны protected методы, а в connect не происходит прямого доступа к защищенному методу, только лишь его описание, прототип. Вызов защищенного слота происходит уже внутри класса (как и положено) QTableView/Widget.
|
Автор: archimed7592 5.12.2007, 15:01 |
SABROG, да при чём тут private/protected ![]() |
Автор: SABROG 5.12.2007, 15:39 | ||
Дык уже ответили человеку http://forum.vingrad.ru/index.php?showtopic=184964&view=findpost&p=1335546 Не надо путать сигналы со слотами. Сигналы "испускают" сами классы, нам не надо их звать, они сами придут. А чтобы мы узнали о их приходе нам надо повесить на дверь звонок в виде слота. А то уйдет сигнал вместе с бутылкой пива (параметром) так и не услышанным. Собственноручно сигналы надо писать только в том случае, если создаем новый класс или модифицируем старый так, чтобы он сообщал о каком-то новом действии, которого не реализовали. Например для QLineEdit можно придумать сигнал, который прийдет если текстовое поле стало пустым, чтобы сделать неактивной кнопку "OK", если продолжение программы невозможно без ввода каких-нибудь данных, скажем серийного кода. Правда пример не очень хороший, т.к. сигнала textChanged вполне хватит на проверку пустоты. Чтобы не быть голословным, пример на базе класс QItemSelectionModel. Класс испускает сигнал currentChanged, если удаляет, вставляет строки и т.д.
|
Автор: archimed7592 5.12.2007, 18:17 | ||||||
SABROG, Вы, скорее всего, не совсем верно меня поняли, или, может быть, читали ветку через строку ![]() Да я то, к слову, и не путаю - потому мне и не понятна сложившаяся ситуация ![]()
Да. Только маленькая поправочка, а точнее две: 1. сигналы испускают не классы, а объекты. 2. они испускают только сигналы, зарегестрированные в метаобъектной системе Qt. SABROG, хорошо, теперь скажите мне на основании всего что Вы написали, откуда в этом классе взялся сигнал currentChanged? Обратите внимание: 1. Речь о классе QTableView. 2. В классе QTableView нет сигнала currentChanged. 3. Programister0 выкинул из моего примера строки:
4. Ему якобы удалось соеденить с несуществующим сигналом какой-то слот и, якобы, он работает:
Собственно, если поверить Programister0 на слово и выкинуть из 4-го пункта слова "якобы", то получается нечто, мне не понятное. |
Автор: SABROG 5.12.2007, 18:43 |
Под ООП в С++ я всегда подразумевал классы. Т.е. объектно ориентированное программирование - объект = класс. Ну тогда стоит еще одно уточнение сделать, каждый объект на базе класса QObject. А таких там большинство. Слот currentChanged там есть. А вот сигнала я такого тоже не нашел. Либо у него на самом деле ничего не работает, либо у нас разные версии Qt ;) |
Автор: archimed7592 5.12.2007, 19:29 |
Что ж, раз по делу сказать нечего, то могу только лишь порекомендовать в будущем читать топики внимательней, особенно, если собираетесь в них отвечать ![]() |
Автор: SABROG 5.12.2007, 19:49 | ||
Пока автор не выложит исходники конечного рабочего варианта гадать бессмысленно. Но я так понял он нашел для себя ответ и тема ему больше не интересна. Если смотреть исходный код QAbstractItemView (базовый класс для QTableView), то переопределенный currentChanged слот начнет срабатывать после вызова setModel. И тогда этот код будет рабочим без определения своего сигнала в таком виде:
|
Автор: Programister0 5.12.2007, 23:39 | ||||||||||
эта тема мне ещё интересна, я пока непонимаю откуда берутся сигналы типа: currentChanged, и
это в самом начале написал archimed7592 и оно работает хоть он в это и не верит:
далее в своих производных от Ui_* классах прописываю коннект:
и myTable1Change - срабатывает как только меняется тек-я поз-я курсора! |
Автор: archimed7592 6.12.2007, 15:01 | ||||
Вообще говоря, идея заключалась как раз таки в том, чтобы добавить сигнал и забыть о слове "наследование", а никак не наоборот.
А чуть выше ты говорил про совсем другие строки. Что ж... Теперь всё понятно ![]() |
Автор: SABROG 6.12.2007, 16:42 |
"Безнаследственный" вариант я написал на первой странице. А вот кто пускает сигнал currecntChanged я так и не понял, если его нет в производных классах и он не переопределяется. Если только каким-то странным образом слот currentChanged не превратился в сигнал. |
Автор: archimed7592 6.12.2007, 17:08 | ||
Так и есть ![]() |
Автор: Любитель 9.12.2007, 00:30 | ||
Только это идеологически нехорошо ![]()
С точки зрения прямого чтения доков (о, как!) - возможно и первое ![]() Наиболее правильный вариант - называть сигнал по-другому... Другой вариант (решает проблему 1, но никак не 2 ![]() |
Автор: Mnior 11.1.2008, 04:02 | ||
Прикольный баг, перенести функцию из slot в signal ![]() Интересно, а что если после переноса в сигналы сделать енто:
![]() Да и вообще эта вся метаструктура в QT контролирует, что подаётся в slot() и signal(), а может там обыкновена функция и даже может и не бублик? |