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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 81
1  Qt / Пользовательский интерфейс (GUI) / Re: Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 17:54
5.6.1

4-й Qt в Android не работает.

ПС. Обожаю виджеты самописки - много геморроя убирают...

Это сарказм такой?... Геморроя ещё больше - совершенно не прозрачно когда вызываются методы для пропертей, когда что надо пересчитывать заново и т.д. Впрочем это уже к вопросу темы не имеет отношения - просьба не развивать.
2  Qt / Пользовательский интерфейс (GUI) / Re: Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 17:22
Да, ещё, кстати забыл упомянуть - это всё происходит в Android. В дизайнере на десктопе под Linux этот виджет рисует только фон, текст почему-то вообще не появляется (некогда сейчас разбираться). Но с QWidget и в дизайнере даже фона не было.
3  Qt / Пользовательский интерфейс (GUI) / Re: Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 16:56
Я же говорю - поменял QWidget на QFrame и использовал frameRect() - всё заработало.
А если сейчас обратно поменять на QWidget? Если не заработает, выкладывайте исходник этого виджета. Улыбающийся

Не заработает. Ничего менять не буду - уже другим занят. Не пришлю. Proprietary.  Улыбающийся
4  Qt / Пользовательский интерфейс (GUI) / Re: Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 16:53
Архив нужно приложить?

Нет, не нужно. Я же говорю - поменял QWidget на QFrame и использовал frameRect() - всё заработало.

Мало ли... во-первых, это у меня кастомный плагин, во-вторых, этот виджет привязан к QWidgetItem, лежащему на графической сцене.


5  Qt / Пользовательский интерфейс (GUI) / Re: Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 16:52
А почему вы здесь используете geometry?
Код
C++ (Qt)
   p.fillRect( geometry(), QBrush(backcolor) );
 

Здесь должен быть rect(). Посмотрите что возвращает geometry().


Да не важно - paintEvent() вообще не вызывался. Там как раз был отладочный qDebug()<<geometry(); в начале, он не выводил ничего. То есть совсем ничего. Для QFrame там frameRect() сейчас.
6  Qt / Пользовательский интерфейс (GUI) / Re: Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 16:08
А вы можете компилируемый пример показать, где не вызывается paintEvent?
Никогда с таким не сталкивался, куча виджетов наследуется от QWidget и все нормально.

Да не, для этого его создавать отдельно надо. На пальцах всё просто было:

Код:
class TLwidget : public QWidget
{
...
    void timeout();
...
protected:
    void paintEvent(QPaintEvent*);
...
};

void TLwidget::timeout()
{
...
    update();
    qDebug()<<"drawn";
}

void TLwidget::paintEvent(QPaintEvent*)
{
    QPainter p(this);
    p.fillRect( geometry(), QBrush(backcolor) );
    p.setPen( QPen(forecolor) );
    p.setFont(font);
    p.drawText( xpos, ypos, text );
}

Ну единственное, что это ещё и плагин дизайнера, с пропертями и всякой такой всячиной. Но это всё не существенно - при наследовании от QWidget текста и фона на виджете нет (в отладку печатает drawn), при наследовании от QFrame всё есть.
7  Qt / Пользовательский интерфейс (GUI) / Re: Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 14:59
Ну это там всё относится к компоновке, а не к рисованию - в моём случае пока не важно, автоматический компоновщик пока что не используется. Но всё равно может пригодиться, спс.
8  Qt / Пользовательский интерфейс (GUI) / Re: Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 14:46
QWidget в отличие от QFrame (->Qlabel) не определяет некоторые базовые методы связанные с размерами виджета

Странно... у виджета же есть geometry(), размеры заданы в дизайнере.

То есть, достаточно QFrame наследовать? Попробую... - да, действительно. При наследовании QFrame работает нормально.
9  Qt / Пользовательский интерфейс (GUI) / Что всё-таки не так с paintEvent() после QWidget::update()? : Январь 17, 2017, 14:38
В который раз столкнулся - класс наследует QWidget, в нём переопределён paintEvent(), и при вызове update() или repaint() он не вызывается. Всякий раз находил обходные пути - сейчас вместо QWidget унаследовал QLabel, у него при update вызывается paintEvent(). То есть, буквально поменял родительский класс - и заработало как надо. У QLabel есть лишний для меня функционал, да и чёрт с ним.

Но хотя бы для спортивного интереса любопытно - почему так? Ковырять для этого исходники некогда - может уже кто-то ковырял?
10  Разное / Юмор / Сам себе родитель. : Январь 16, 2017, 21:12
Был раньше виджет, в котором было поле QLabel. Виджет был кастомный плагин для Creator. Решил переделать его, чтобы QLabel наследовался - чтобы сделать свой paintEvent(). На автомате поиском с заменой убрал все вхождения "label.". Заменил в заголовке конструктора инициализацию QWidget(parent) на QLabel(parent). Всё собрал, запускаю, открываю форму с этим виджетом, и QtCreator виснет... Возякаюсь полчаса, и наконец замечаю в конструкторе:

setParent(this);

раньше же было

label.setParent(this);

Очень живо себе представил, как QLabel удивляется как в том наркоманском анекдоте:

...Стук в дверь
- Кто там?
- Мама, это я...
- ДА ТЫ ГОНИШЬ! МАМА - ЭТО Я!!!
11  Qt / Пользовательский интерфейс (GUI) / Re: Долбаный QSlider... : Декабрь 28, 2016, 19:17
ВСЁ! Победил... без создания собственного стиля, нафик он не нужен. Разобрался по исходникам, что управление перемещением производится в style()->subControlRect() виджета, и это вызывается прямо из paintEvent(). При этом туда надо передавать  

Код:
   QStyleOptionSlider o;
    initStyleOption(&o);

который принимает параметры текущего виджета. Если у него перед вызовом style()->subControlRect() изменить прямоугольник с помощью

Код:
   o.rect.setWidth( o.rect.width() - knobwidth );
    o.rect.moveLeft( knobwidth/2 );

то будут получены и ручка слайдера, и прорезь в соответствии с прямоугольником меньше виджета. Для горизонтального слайдера, разумеется. Для вертикального аналогично, но с высотой и перемещением вверх. И потом уже на ручке надо отрисовывать свою картинку. Всё работает как надо, ручка не обрезается. Там же можно легко сделать прорезь шириной или высотой в виджет, чтобы ручка по ней ездила.

Единственное, что удручает - это то, что в угоду разным стилям subControlRect() по разному вычисляет координаты и размеры в разных ОС. В результате выглядит это всё совсем не одинаково в Kubuntu, Android и Windows. Как надо получилось сначала только в Android. Можно было бы и свой стиль соорудить, но гораздо проще было послать нафик все эти извраты и ещё раз перед рисованием самому всё пересчитать.
12  Qt / Пользовательский интерфейс (GUI) / Re: Долбаный QSlider... : Декабрь 28, 2016, 11:02
Делал свой стиль
Это в моём случае лишнее. Мне надо только для QSlider картинки в дизайнере указывать. Ну ещё для кнопки и дайала, но там уже всё сделано как следовало, без стилей.

Нашёл наконец-то, где вычисляется позиция ручки, в моём случае это в QCommonStyle::subControlRect(). Там прямая зависимость от ширины слайдера, а не от ширины прорези. ИМХО - это баг. Но по-прежнему не понятно, как получается правильный "фирменный" слайдер, так как его позиция тоже в QCommonStyle::subControlRect() вычисляется.
13  Qt / Пользовательский интерфейс (GUI) / (РЕШЕНО) Долбаный QSlider... : Декабрь 27, 2016, 23:32
Сделал плагин для дизайнера на основе QSlider чтобы можно было задавать изображения ручки и прорези. Слайдер пока только горизонтальный - вертикальный потом доделать несложно. Требуется, чтобы при изменении высоты слайдера пропорционально изменялся размер ручки. А при изменении ширины изменялась только ширина прорези. Поэтому использование таблицы стилей не подходит - с ним невозможно в дизайнере менять размеры ручки. Перегрузил paintEvent(), всё почти заработало сразу. Но проблема - прорезь рисуется на всю ширину виджета, а центр ручки бегает между левым и правым краями прорези. Соответственно, в крайних положениях половина ручки обрезается. И долбаюсь уже второй день, пытаюсь выяснить, как сделать, чтобы ширина прорези была меньше ширины виджета, и центр ручки перемещался только между краями прорези. Требуемую прорезь получил, но при этом выяснил, что все положения ручки родительский класс вычисляет не по ширине прорези, а по ширине виджета. То есть, даже если прорезь меньше виджета, то ручка всё равно бегает между крайними границами виджета и обрезается на краях. Что только не пробовал, ни в какую.

Но ведь должно же как-то правильно работать! Беру оригинальный QSlider - у него всё в порядке. Ничего не обрезается, ручка двигается между краями прорези, которая меньше виджета... Обеспокоенный Полез исходники QSlider ковырять - там чёрт ногу сломит. Вижу, где двигается слайдер, где мышиное событие обрабатывается. Но никак не могу найти - где вычисляются "точки останова", их положение в виджете. Ограничитель при перемещении ручки - это значение, а не координаты. То есть, упирается влево он при достижении заданного минимального значения. Но как попадает на свою крайнюю левую позицию? Где она задана? Причём по коду перемещения слайдера вообще не видно, как ручка "тормозит" на промежуточных позициях. Перемещение ручки вообще "плавное"! И этого же не видно в коде отрисовки ручки, там только рисование.

Кто-нибудь расковыривал исходники слайдера? Если не получится сделать, придётся реализовать на таблице стилей, а это ГОРАЗДО хуже, так как размеры ручки нельзя будет менять в дизайнере.
14  Qt / Пользовательский интерфейс (GUI) / Re: Наследование QDial - странные значения : Декабрь 20, 2016, 21:51
БУГАГА!!! Я расковырял в чём проблема - мой косяк... вчера под вечер на скорую руку наляпал, и зевнул. Надо же изображение QDial крутить - а он у меня лежит привязанный к QGraphicsItem на сцене. Ну я и закрутил этот айтем вместо того, чтобы крутить картинку. Смеющийся А он при вращении под палец подсовывает другое место QDial. И тот перепрыгивает на другой угол и выплёвывает другое значение. А это снова приводит к повороту того же айтема. Но палец то сдвигается - он уже на другом месте. QDial выдаёт новое правильное значение и снова прыгает. В общем, клоунада получилась. Мораль - снова в который уже раз подтверждена истина - нефиг вкалывать по 12-13 часов практически подряд.  Веселый
15  Qt / Пользовательский интерфейс (GUI) / Re: Наследование QDial - странные значения : Декабрь 20, 2016, 15:06
Чё-то я перехвалил... сделал вращение, и вижу, что картинка скачет туда-сюда. Снова вывел значения value, теперь уже в обработчике сигнала - и опять значения больше-меньше-больше-меньше.  Злой

Повесил рядом родной QDial такого же размера, его кручу - с него всё ровно идёт. Настройки у них одинаковые, умолчательные.
Страниц: [1] 2 3 ... 81
Страница сгенерирована за 0.139 секунд. Запросов: 23.