crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QRect относительно главного окна
512es
  опции профиля:
сообщение 25.3.2011, 3:37
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Имеется окно, в нём виджет.

В виджете ещё один виджет (делегат).
Имеется QRect этого делегата, но все его координаты относительно виджета.

Вопрос:
Как получить QRect делегата по отношению к главному окну??
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.3.2011, 9:10
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


можно использовать функцию QWidget::
QPoint    mapTo ( QWidget * parent, const QPoint & pos ) const


для получения нужной точки верхнего левого угла:
виджет->mapTo(главное_окно, угол_прямоугольника_в_координатах_виджета)

, а затем выполнить QRect::moveTo()

Сообщение отредактировал Алексей1153 - 25.3.2011, 9:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 25.3.2011, 14:57
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Спасибо. Но всё равно немного не понятно..
Запутался я чего то..

class textEditDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit textEditDelegate(QWidget *parent = 0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
........
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QWidget *mainWnd;
};


textEditDelegate::textEditDelegate(QWidget *parent) :
    QStyledItemDelegate(parent), mainWnd(parent)
{
}

QWidget *textEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&  option , const QModelIndex& /* index */) const
{
    QPlainTextEdit *editor = new QPlainTextEdit(mainWnd);
    editor->installEventFilter(const_cast<textEditDelegate*>(this));
    return editor;
}

void textEditDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex& /* index */) const
{
    qDebug() << editor->mapTo(mainWnd,option.rect.topLeft());
    editor->setGeometry(option.rect.x()+10, option.rect.y()-25, option.rect.width()-20, option.rect.height()+50);
}



То есть чтобы получить правильные координаты мне надо сделать:
parent->mapTo(mainWnd,option.rect.topLeft());

Где parent это тот самый parent из функции createEditor?
Почему то в createEditor он равен QWidget(0x820110, name = "qt_scrollarea_viewport")

И как мне получить доступ к нему в функции updateEditorGeometry? Глобальные переменные в этом классе компилятор мне не даёт создавать, ругаясь на "assignment of data-member in read-only structure", чего я ещё не до конца понял..


Всё это пытаюсь сделать для того, чтобы больших размеров делегат в таблице не был ограничен таблицей а появлялся над всем приложением.

Может можно как нибудь это покрасивее сделать? В плане кода..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 26.3.2011, 11:50
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


как-то так

//конвертируем координаты из относительных для editor->parent() в относительные для mainWnd
option.rect.moveTo(editor->parent()->mapTo(mainWnd,option.rect.topLeft()));
//устанавливаем нужные размеры, если надо
option.rect.setWidth(...);
option.rect.setHeight(...);


(не компилировал, естественно)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 26.3.2011, 16:05
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 26.3.2011, 12:50) *
как-то так

//конвертируем координаты из относительных для editor->parent() в относительные для mainWnd
option.rect.moveTo(editor->parent()->mapTo(mainWnd,option.rect.topLeft()));


Не.. К сожалению так не получается.
Ведь editor->parentWidget() = mainWnd
а editor->parent() это QObject mainWnd, и у него нет метода mapTo()

Вижу пока лишь один выход.. Передавать указатель на виджет (таблицу) при создании делегата.

Не, не получается. Не знаю как получить из tableView его qt_scrollarea_viewport.

Хотя можно было бы проще сделать, если бы добавить новую переменную в класс, которую можно изменять. Не пойму почему возникает "assignment of data-member in read-only structure" =(

тот parent который qt_scrollarea_viewport, появляется только в createEditor() и никак не могу скопировать указать на него никуда, или получить этот указатель из tableView
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 26.3.2011, 16:36
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Пробовал искать вот так:
qDebug() << tableView->findChildren<QWidget *>("qt_scrollarea_viewport");

Находит сразу 3 штуки. Один из них нужный, но как его выбрать?

А ещё вот так:
qDebug() << tableView->childAt(option.rect.topLeft());

Вот так находит правильный, но не всегда. Если вызвать делегат на первой строке таблицы, то результат будет другой.

Ещё пробовал снимать атрибут const в:
QWidget *textEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&  option , const QModelIndex& /* index */) const

Так позволяет присваивать значения переменным, но программа крашится при первом же вызове делегата.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 26.3.2011, 22:26
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Итак, как всегда отвечаю сам себе =)
QWidget *widg;
int max = 0;
foreach (QWidget *wid, tableView->findChildren<QWidget *>("qt_scrollarea_viewport")) {
   int cur = wid->rect().height() * wid->rect().width();
   if (cur > max) {
       widg = wid;
       max = cur;
   }
}
qDebug() << widg;

Выбрав viewport с самой большой площадью я получил указатель на нужный виджет.
Но решение не красивое..

Почти сразу же нашёл способ гораздо красивее и проще.
Оставляем в createEditor() парента по дефолту.
А уже в updateEditorGeometry меняем его на главное окно.
Вот так:
if (editor->parentWidget() == mainWnd) return;
QPoint pt = editor->parentWidget()->mapTo(mainWnd,option.rect.topLeft());
editor->setParent(mainWnd);
editor->setGeometry(pt.x()+10, pt.y()-25, option.rect.width()-20, option.rect.height()+50);


Сообщение отредактировал 512es - 26.3.2011, 22:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.3.2011, 15:37
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


512es, некрасивое решение - менять родителя. Добавь лучше мембер-указатель.

Цитата(512es @ 26.3.2011, 18:05) *
Не пойму почему возникает "assignment of data-member in read-only structure" =(

а когда возникает ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 27.3.2011, 17:21
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 27.3.2011, 16:37) *
Цитата(512es @ 26.3.2011, 18:05) *
Не пойму почему возникает "assignment of data-member in read-only structure" =(

а когда возникает ?

Когда внутри функции createEditor() пытаюсь присвоить значение любой внешней переменной, в т.ч. и указателям. Потому и не нашёл другого пути как вытащить оттуда указатель на парент.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 28.3.2011, 7:54
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


512es, так у тебя функция createEditor() имеет спецификатор const
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 15:28