Russian Qt Forum
Ноябрь 23, 2024, 18:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с QTableCornerButton в QTableView  (Прочитано 5966 раз)
Istrid
Гость
« : Сентябрь 09, 2012, 23:23 »

Добрый день. Возникла задача вместо стандартной кнопки на пересечении двух хедеров в QTableView, сделать ComboBox, при нажатии на который чекались все комбобоксы в вертикальном хедере (туда их уже засунул). Проблема в том, что этот QTableCornerButton зашит рядом с классом QTableViewPrivate, и инициализируется в нем же. До QTableViewPrivate добраться не получается, потому что из DLL-ки он не экспортируется.
Подскажите, как можно до него этой чудо-кнопки достучаться. Вроде довольно тривиальный функционал.
Записан
Istrid
Гость
« Ответ #1 : Сентябрь 10, 2012, 01:13 »

Еще нашел что-то похожее на решение :

для доступа к приватным классам Qt:

namespace Hack { template <class To, class From> inline To* d_ptr(From* ptr){ return (To*)QObjectPrivate::get(ptr);}}

Эту функцию можно использовать например для включения функционала в QLineEdit, который пишет текст типа "введите сюда что-нибудь", когда в QLineEdit ничего нет:

#include "private/qlineedit_p.h"
...
{
    Hack::d_ptr<QLineEditPrivate>(ui->lineEdit)->placeholderText = "Test";
}

Или для установки своего виджета вместо QTableCornerButton в QTableView:

#include "private/qtableview_p.h"
...
QLabel* label = new QLabel(ui->tableWidget);
label->setText("<span style=\"color: red\">Bye</span> <span style=\"color: green\">Bye</span>, <span style=\"color: blue\">World!</span>");
label->setAlignment(Qt::AlignCenter);
QTableViewPrivate* tvPrivate = Hack::d_ptr<QTableViewPrivate>(ui->tableWidget);
tvPrivate->cornerWidget->deleteLater();
tvPrivate->cornerWidget = label;


Но при подключении #include "private/qtableview_p.h" ругается, создаю папку private, кидаю туда qtableview_p.h, он ругается на "private/qtabstractitemview_p.h" и по кругу до qobjecta.
Записан
Bepec
Гость
« Ответ #2 : Сентябрь 10, 2012, 07:40 »

setCornerWidget ( QWidget * ) чем вам не подошёл?

Пробуйте, смотрите, наслаждайтесь результатом и... И дай вам боже пока не лазить в исходники . Улыбающийся
Записан
Istrid
Гость
« Ответ #3 : Сентябрь 10, 2012, 10:55 »

Он мне не подошел потому что не работает) Это другой CornerButton. Он идет от QScrollArea и является вообще чем-то странным.
Если б все было так просто)
Записан
Bepec
Гость
« Ответ #4 : Сентябрь 10, 2012, 10:57 »

Кхм. Нарисуй что тебе надо. В пейнте али ещё как. Тогда мб помогу Улыбающийся А то не совсем понимайт твою хотелку Улыбающийся
Записан
Istrid
Гость
« Ответ #5 : Сентябрь 10, 2012, 11:24 »

вот) на рисунке подчеркнул чудо-кнопку. Вместо нее нужен чекбокс, как под ней.
Записан
Bepec
Гость
« Ответ #6 : Сентябрь 10, 2012, 13:51 »

Достать эту часть действительно невозможно Улыбающийся Она запрятана глубокоооо...

Есть простое решение/хак. Думаю вам подойдёт.

Создаём QCheckBox с родителем QTableView. Мувим его на центр той кнопки. Саму кнопку делаем неактивной методом setCornerButtonEnables. И уже в программе обрабатываем нащёлкивания на него.

Конечно необходимо подумать и об центровке - но это довольно легко. Данные о длине/щирине можно брать из Horizontal/VerticalHeader. И при ресайзе чекбокс двигать.

PS вроде просто и доступно объяснил. Но это конечно же хак Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 20.