Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Istrid от Сентябрь 09, 2012, 23:23



Название: Проблема с QTableCornerButton в QTableView
Отправлено: Istrid от Сентябрь 09, 2012, 23:23
Добрый день. Возникла задача вместо стандартной кнопки на пересечении двух хедеров в QTableView, сделать ComboBox, при нажатии на который чекались все комбобоксы в вертикальном хедере (туда их уже засунул). Проблема в том, что этот QTableCornerButton зашит рядом с классом QTableViewPrivate, и инициализируется в нем же. До QTableViewPrivate добраться не получается, потому что из DLL-ки он не экспортируется.
Подскажите, как можно до него этой чудо-кнопки достучаться. Вроде довольно тривиальный функционал.


Название: Re: Проблема с QTableCornerButton в QTableView
Отправлено: Istrid от Сентябрь 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.


Название: Re: Проблема с QTableCornerButton в QTableView
Отправлено: Bepec от Сентябрь 10, 2012, 07:40
setCornerWidget ( QWidget * ) чем вам не подошёл?

Пробуйте, смотрите, наслаждайтесь результатом и... И дай вам боже пока не лазить в исходники . :)


Название: Re: Проблема с QTableCornerButton в QTableView
Отправлено: Istrid от Сентябрь 10, 2012, 10:55
Он мне не подошел потому что не работает) Это другой CornerButton. Он идет от QScrollArea и является вообще чем-то странным.
Если б все было так просто)


Название: Re: Проблема с QTableCornerButton в QTableView
Отправлено: Bepec от Сентябрь 10, 2012, 10:57
Кхм. Нарисуй что тебе надо. В пейнте али ещё как. Тогда мб помогу :) А то не совсем понимайт твою хотелку :)


Название: Re: Проблема с QTableCornerButton в QTableView
Отправлено: Istrid от Сентябрь 10, 2012, 11:24
вот) на рисунке подчеркнул чудо-кнопку. Вместо нее нужен чекбокс, как под ней.
(http://s2.hostingkartinok.com/uploads/thumbs/2012/09/a26fcf2dfc649b0e17f54b6a716150f5.png) (http://hostingkartinok.com/show-image.php?id=a26fcf2dfc649b0e17f54b6a716150f5)


Название: Re: Проблема с QTableCornerButton в QTableView
Отправлено: Bepec от Сентябрь 10, 2012, 13:51
Достать эту часть действительно невозможно :) Она запрятана глубокоооо...

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

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

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

PS вроде просто и доступно объяснил. Но это конечно же хак :)