Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CornerButton в QTableVew, как можно добраться до этой кнопки?? 
:(
    Опции темы
Dark2011
Дата 15.11.2012, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



Добрый вечер! Кто-нибудь знает как можно изменить поведение этой кнопки??? 
Речь идет об кнопке на пересечении вертикальных и горизонтальных заголовках QTableView

По умолчанию она включена и ее поведение  - выделение всего содержимого таблицы...

вот все что с ней можно делать)
void    setCornerButtonEnabled ( bool enable )

а мне нужно чтоб при нажатии в ней что нить выделялось (например какая нить галочка рисовалась или точка))) и уходил сигнал)
PM MAIL   Вверх
loneybibi
Дата 16.11.2012, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Найти в исходниках QTableView(QTableWidget) эту кнопку и переопределить у класса что она должна делать! smile

Это сообщение отредактировал(а) loneybibi - 16.11.2012, 09:26


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Dark2011
Дата 16.11.2012, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



Можно чуть чуть поподробнее?? В исходниках я нашел эту кнопку ....но я прост не очень понимаю что нужно сделать....мне что в самом исходнике надо поменять поведение,?? Никогда во внутрях не копался не знаю как такое делают....
PM MAIL   Вверх
loneybibi
Дата 16.11.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(Dark2011 @ 16.11.2012,  14:01)
Можно чуть чуть поподробнее?? В исходниках я нашел эту кнопку ....но я прост не очень понимаю что нужно сделать....мне что в самом исходнике надо поменять поведение,?? Никогда во внутрях не копался не знаю как такое делают....

Просто надо создать класс наследованный от QTableView и в нем переопределить функцию которая отвечает за эту кнопку.

update:  переопределить не получиться читайте пост ниже.. 

Это сообщение отредактировал(а) loneybibi - 16.11.2012, 16:54


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
loneybibi
Дата 16.11.2012, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Почитал пару топиков по форумам (кстати не ленитесь использовать поиск в интернете), выяснил что класс QTableView создается на основе приватного(закрытого) класса QTableViewPrivate, ну не именно вся таблица, а вот конкретно угловая кнопка. Так что доступ к ней закрыт. Есть способ просто отменить ее сигнал что бы она не работала. Вообщем трудно это очень будет сделать.

Простым решением будет по верх этой кнопки рисовать свою и корректировать геометрию. 
Вот тема: http://www.prog.org.ru/topic_7085_0.html

Есть у класса функция setCornerWidget наследованная от QAbstractScrollArea , которая должна устанавливать угловой виджет, но она не работает, походу тоже находиться в приватной секции.

Пытался получить доступ к кнопке что бы подсоединить свой сигнал через QTableView::cornerWidget() но увы он тоже чет не работает. 

Может кто еще что подскажет по этому поводу... я не знаю.. 

Вообще погуглите - corner widget in QTableView  - может что найдете.


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
loneybibi
Дата 16.11.2012, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Я ошибался! smile Что такое сделать нельзя. Потратив "немного" времени, я все таки нашел как это можно сделать!!!!
Довольно таки даже просто! smile

Код

    /** Допустим наша представление данных **/
    QTableView *view=new QTableView;
    view->setModel(model);

    /** Создаем переменную абстрактного класса кнопки так как на его основе
    сделана кнопка в углу таблицы. Потом методом конвертации классов записываем
    в переменную указатель на кнопку из таблицы. А находим эту кнопку по
    дочерним эелементам, выяснил что это 6-ой дочерний эелемент методом вывода 
    списка в консоль отладки **/
    QAbstractButton *button=static_cast<QAbstractButton*>(view->children().at(6));

    /** Отсоединяем все слоты прикрепленные к кнопке в углу **/
    disconnect(button,0,0,0);
    /** Подключаем свой и радуемся  :) **/
    connect(button,SIGNAL(clicked()),this,SLOT(slot()));



--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Dark2011
Дата 16.11.2012, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



Очень круто! Спасибо огромное! Можно только пояснить  вот эту фразу:
"А находим эту кнопку по   дочерним эелементам, выяснил что это 6-ой дочерний эелемент методом вывода  списка в консоль отладки"


что означает вот такая штука??
Q_PROPERTY(bool cornerButtonEnabled READ isCornerButtonEnabled WRITE setCornerButtonEnabled)

я нашел в исходниках QWidget *cornerWidget; но эт поле идет не 6 ым по счету....объясните пожалуйста, хочу разобраться)
PM MAIL   Вверх
loneybibi
Дата 16.11.2012, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



С помощью qDebug()<< выводим все элементы на которых базируется QTableView с помощью функции children():
Код

qDebug()<<view->children();

Получаем вот такой вывод массива(список) элементов в отладку:
Код

(QWidget(0x1680740, name = "qt_scrollarea_viewport") ,  QWidget(0x16807d0, name = "qt_scrollarea_hcontainer") ,
QWidget(0x166a180, name = "qt_scrollarea_vcontainer") ,  QStyledItemDelegate(0x166b220) ,  QHeaderView(0x1669da0) ,
QHeaderView(0x1681410) ,  QTableCornerButton(0x16793d0) )  

В нем находим элемент класса QTableCornerButton. Далее пальцем считаем что он седьмой по счету, а так как нумерация 
элементов массива по стандарту языка C++ начинается не с единицы а с нуля, указываем индекс 6 что и будет
означать седьмой (в человеческом исчислении) элемент массива.


А про это уже читайте стандарты и возможности библиотеки Qt:
Код

Q_PROPERTY(bool cornerButtonEnabled READ isCornerButtonEnabled WRITE setCornerButtonEnabled)

В данном случае оно вам не надо! smile

Это сообщение отредактировал(а) loneybibi - 16.11.2012, 20:12


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Dark2011
Дата 16.11.2012, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



Круто! Спасибо!!
PM MAIL   Вверх
loneybibi
Дата 16.11.2012, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(Dark2011 @ 16.11.2012,  19:12)
Круто! Спасибо!!

Нема за що ! smile  Буду рад положительным отзывам !  smile 


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Dark2011
Дата 16.11.2012, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



а больше с ней ничего нельзя делать?? 
PM MAIL   Вверх
loneybibi
Дата 16.11.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(Dark2011 @ 16.11.2012,  19:29)
а больше с ней ничего нельзя делать??

С кем ? smile с кнопкой? 
Я думаю что нет, я пытался ей текст выставить с помощью метода setText() но он не отобразился, 
возможно перерисовывать надо вручную.

Можно на нее подсказку поставить setToolTip().

Может как то еще можно прикрутить контекстное меню это да.

Думаю вряд ли что то еще получиться так как кнопка рисуется как примитив.
Код

style()->drawPrimitive(QStyle::PE_PanelScrollAreaCorner, &option, &p, this);

Точнее это даже не кнопка а вместо нее рисуется просто квадратик ! smile 
Вывести на нее иконку или текст тоже маловероятно, по крайней мере я не знаю как!

Это сообщение отредактировал(а) loneybibi - 16.11.2012, 21:02


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Dark2011
Дата 16.11.2012, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



да я тож пробывал setText....не работает....

вот нашел здесь же такую тему - там используют какой то хак добираясь таким образом до исходников....


PM MAIL   Вверх
loneybibi
Дата 16.11.2012, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(Dark2011 @ 16.11.2012,  20:43)
да я тож пробывал setText....не работает....

вот нашел здесь же такую тему - там используют какой то хак добираясь таким образом до исходников....

не факт что этот хак будет работать на другой версии qt кроме как той на которой его сделали , или даже на другой ос или компиляторе ! 


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Dark2011
Дата 16.11.2012, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0624 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.