Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > CornerButton в QTableVew


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

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

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

а мне нужно чтоб при нажатии в ней что нить выделялось (например какая нить галочка рисовалась или точка))) и уходил сигнал)

Автор: loneybibi 16.11.2012, 08:57
Найти в исходниках QTableView(QTableWidget) эту кнопку и переопределить у класса что она должна делать! smile

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

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

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

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

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

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

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

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

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

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

Автор: loneybibi 16.11.2012, 18:12
Я ошибался! 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()));

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


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

я нашел в исходниках QWidget *cornerWidget; но эт поле идет не 6 ым по счету....объясните пожалуйста, хочу разобраться)

Автор: loneybibi 16.11.2012, 19:58
С помощью 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

Автор: Dark2011 16.11.2012, 20:12
Круто! Спасибо!!

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

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

Автор: Dark2011 16.11.2012, 20:29
а больше с ней ничего нельзя делать?? 

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

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

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

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

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

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

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

Автор: Dark2011 16.11.2012, 21:43
да я тож пробывал setText....не работает....

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


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

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

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

Автор: Dark2011 16.11.2012, 22:03
http://forum.vingrad.ru/topic-295624.html

Автор: loneybibi 16.11.2012, 22:27
Цитата(Dark2011 @ 16.11.2012,  21:03)
http://forum.vingrad.ru/topic-295624.html

Это не хак а "хак" smile фильтр событий в котором как я говорил кнопка перерисовывается вручную)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)