crossplatform.ru

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

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Помогите разобраться с отрисовкой виджета
XpycT
  опции профиля:
сообщение 20.7.2009, 17:51
Сообщение #1


Студент
*

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

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




Репутация:   0  


Всем доброго времени суток :)
С Qt знаком всего полторы недели, и то, все это время читал книги. Вот захотелось реализовать виджет выбора рисунка (не хочется делать просто текстовое поле с адресом). За основу взял исходники примера с гита Qt. Но к моему сожалению понял, что прочитанных разделов о графике в книгах не достаточно :(.

Хочется сделать что-то типа такого :
Прикрепленное изображение


Но напоролся на пару вопросов:

1) Как в mouseMoveEvent определить потерю фокуса мыши (event->Leave почемуто действует аналогично event->Enter)?
2) Каким образом прикрутить сигнал/слот к иконке "Открыть"/"Очистить", если они выведены через painter.drawPicture

Вот те исходники, над которыми я прыгал с бубном Прикрепленный файл  imagewidget.zip ( 2.48 килобайт ) Кол-во скачиваний: 71


За раннее благодарю за помощь :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 20.7.2009, 18:52
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


XpycT,
Цитата
void ImageWidget::paintEvent(QPaintEvent*)
{


    QPainter painter(this);
    QPainter painter1(this);
...


на сколько я знаю так делать нельзя
надо тчобы на одном контексте один рисовальщик был.

+

зачем тебе mouseMoveEvent(QMouseEvent *event)
если есть enterEvent(QEvent *event) && leaveEvent(QEvent *event)

Цитата(XpycT @ 20.7.2009, 18:51) *
2) Каким образом прикрутить сигнал/слот к иконке "Открыть"/"Очистить", если они выведены через painter.drawPicture

вашпе не понятно что ты хочешь спросить. что значит прикрутить сигнал/слот к иконке если иконка выведена с помощью painter.drawPicture ??

Сообщение отредактировал kwisp - 20.7.2009, 18:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 20.7.2009, 20:44
Сообщение #3


Студент
*

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

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




Репутация:   0  


Первый вопрос решен, спасибо.

Цитата(kwisp)
вашпе не понятно что ты хочешь спросить. что значит прикрутить сигнал/слот к иконке если иконка выведена с помощью painter.drawPicture ??


Да, слабо объяснил. Я имел в виду что в paintEvent'e я добавил две иконки - на открытие нового рисунка и для очистки.
CODE

QImage pic_add(":/images/image_add.png");
QImage pic_del(":/images/image_delete.png");

painter.drawImage(rect().width()-pic_add.width()-25,
rect().height()-35,pic_add);
painter.drawImage(rect().width()-pic_add.width()-5,
rect().height()-35,pic_del);

Просто не пойму как к этим иконкам прикрутить вызов слотов при клике на них :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 20.7.2009, 20:54
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


никаких слотов. Обрабатываешь эвент клика мышки, определяешь попал ли пользователь на кнопку, если да, то на какую, в зависимости от этого вызываешь нужную функцию или посылаешь сигнал, который и коннектися к какому-то слоту.

плюс - в маус мув эвенте отлавливать положение мыши на кнопке и рисовать ее другой картинкой (чтобы пользователь знал куда будет давить), и при нажатии - тоже менять картинку.

но про слоты и т.п. - первый абзац.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 20.7.2009, 22:07
Сообщение #5


Студент
*

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

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




Репутация:   0  


Как я понимаю, надо ловить координаты мыши в mousePressEvent и сравнивать, попадают ли они в координаты рисунка-кнопки в paintEvent'a, если да - вызывать действие. Ну и аналогично при движении d mouseMoveEvent для изменения состояния кнопки.

Или я не прав, и есть более простой способ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 20.7.2009, 22:52
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Да, именно так. Кстати, вызывать действие я советую только если пользователь не только нажал на кнопку мыши над этим рисунком-кнопкой, но и отпустил мышь на нем. Проверь - нормальные кнопки под винду именно так и работают. Т.е. в pressEvent ты ловишь нажал ли пользователь эту кнопку, сохраняешь себе в память данные об этом нажатии (как угодно, хоть булевой переменной и т.п.), а в releaseEvent смотришь, была ли кнопка нажата, затем проверяешь попал ли этот эвент на нужный прямоугольник, и если попал, то только тогда вызываешь действие.

а в маус муве то же самое - если кнопка уже нажата, то картинку не меняем. Если не нажата - меняем на "в фокусе" ,если мышка на картинке, а если не на картике - на "не в фокусе".

я пользую у себя такой класс на данный момент:
//-----------------------------------------------------------------------------
// File: a_cupics_layoutbutton.h
//
// Desc:
//-----------------------------------------------------------------------------

#ifndef A_CUPICS_LAYOUTBUTTON_H
#define A_CUPICS_LAYOUTBUTTON_H

#include <QObject>
#include <QPixmap>
#include <QRect>

//--------------------------------------------------------------------------------------
// Name: cUPicsLayoutButton
// Desc:
//--------------------------------------------------------------------------------------
class cUPicsLayoutButton
    : public QObject
{
    Q_OBJECT

public:
    // Constructor & destructor
    //----------------------------------------------------------------------------------
    cUPicsLayoutButton(QPixmap pxm, QObject *parent = 0);

    // Enums & others
    //----------------------------------------------------------------------------------
    enum State { Normal, Pressed, Hot };

    // Access functions
    //----------------------------------------------------------------------------------
    QPixmap getView() const;

    QRect rect() { return m_btnRect; }
    int state() const { return m_btnState; }

    // Control functions
    //----------------------------------------------------------------------------------
    void setRect(QRect rect) { m_btnRect = rect; }
    void setState(State s) { m_btnState = s; }
    void setPixmap(QPixmap pxm, State s = Normal);

private:
    // Page paint data
    //----------------------------------------------------------------------------------
    QRect m_btnRect;
    State m_btnState;

    QPixmap m_pxmNormal,
            m_pxmPressed,
            m_pxmHot;

};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 21.7.2009, 0:20
Сообщение #7


Студент
*

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

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




Репутация:   0  


На счет опускания мыши даже не подумал.. надо будет учесть.

А вот на счет определения позиции мыши над кнопкой.
Гдето в исходниках вроде как видел определение самого верхнего рисунка слоя при клике на нем, но не помню толи для пеинтера толи для график виевера, и как на зло не могу вспомнить где :( . Строка была чтото вроде
qobject_cast<const тип*>(sender)

Можно ли как-то таким способом определить нарисованую кнопку, а то мое условие проверки не очень радует, да и к размеру виджета привязано. Ну или на худой конец хоть упростить его :)
void ImageWidget::mouseMoveEvent(QMouseEvent *event)
{
    mousePos = event->pos();
    if((mousePos.x() > (rect().width()-pic_add.width()-25)) &
       (mousePos.x() < (rect().width()-25))    &
       (mousePos.y() > (rect().height()-22))   &
       (mousePos.y() < (rect().height()-6)))
    {
        setCursor(Qt::PointingHandCursor);
        setButton(Open);
    }else if((mousePos.x() > (rect().width()-pic_del.width()-5)) &
       (mousePos.x() < (rect().width()-5))    &
       (mousePos.y() > (rect().height()-22))   &
       (mousePos.y() < (rect().height()-6)))
    {
        setCursor(Qt::PointingHandCursor);
        setButton(Clear);
    }else{        
        setCursor(Qt::ArrowCursor);
        setButton(None);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.7.2009, 4:11
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9627
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(XpycT @ 21.7.2009, 4:20) *
Можно ли как-то таким способом определить нарисованую кнопку,
нет, и называй вещи своими именами, тогда всё встанет на свои места. у тебя нет кнопки, у тебя есть рисунок в одной из частей которого, ты нарисовал, что-то ещё. Следовательно у тебя есть только координаты того, что ты нарисовал.
Можешь после рисования куда-нибудь сохранить прямоугольник (QRect), в котором было рисование, потом воспользоваться им, что бы проверять находится ли указатель мыши внутри этого прямоугольника или нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 21.7.2009, 7:56
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Да, лучше всего работать через QRect в данном случае. У него есть очень удобная функция для проверки принадлежности точки данному прямоугольнику.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 21.7.2009, 8:15
Сообщение #10


Студент
*

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

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




Репутация:   0  


Спасибо за советы, думаю разобрался :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.5.2017, 14:30