crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Перемещение QFrame
AD
  опции профиля:
сообщение 16.7.2009, 12:41
Сообщение #1


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


У меня имеется QFrame (визир) c формой QFrame::VLine. Я переопределяю QFrame, т.е. создал потомка от QFrame. Этот QFrame находится на виджете. У виджета определены функции нажатия, движения и отпускания мыши. У QFrame тоже определены. Как заставить QFrame передвинуться и встать на нужное новое место? При этом хотелось бы, чтобы функции передвижения мыши не вызывались. Я правильно понимаю, что в переопределенном виджете надо как-то перехватывать фокус при наведении на визир и ставить флаг игнорирования, а в функциях переопределения мыши виджета проверять флаг игнора? Какую виртуальную функцию виджета надо перехватить при наведении фокуса на визир?
Вот функции мыша визира:
class VFFrame: public QFrame
{
//.....................
bool _is_left_pressed;        ///< флаг указания нажатия на левую кнопку мыши
//.....................
        virtual void mousePressEvent(QMouseEvent* events);
    virtual void mouseMoveEvent(QMouseEvent* events);
    virtual void mouseReleaseEvent(QMouseEvent* events);
};
/// Переопределение нажатия на лекую кнопку мыши
void VFFrame::mousePressEvent(QMouseEvent* events)
{
    QFrame::mousePressEvent(events);

    switch(events -> button())
    {
    case Qt::LeftButton:                ///< если нажата левая кнопка мыши
        _is_left_pressed = true;
    break;
    }
}

/// Передвижение визира вслед за мышью
void VFFrame::mouseMoveEvent(QMouseEvent* events)
{
    QFrame::mouseMoveEvent(events);

    if(!_is_left_pressed) return;
    move(events -> pos());
}

/// Отпускание кнопки мыши
void VFFrame::mouseReleaseEvent(QMouseEvent* events)
{
    QFrame::mouseReleaseEvent(events);

    if(!_is_left_pressed) return;
    _is_left_pressed = false;
    setGeometry(events -> pos().x(), y(), width(), height());
}

Вот функция создания визира в виджете:
/// Создание и отображение вертикального визира
void GraphicDisplay::verticalViewfinder()
{
    if(v_viewfinderAction -> isChecked())
    {
        VFFrame* finder(new VFFrame(paramsDisplay, QFrame::VLine));
        gridLayout -> addWidget(finder, 0, 0, 1, 1);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 16.7.2009, 12:47
Сообщение #2


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

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

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




Репутация:   23  


Цитата(AD @ 16.7.2009, 13:41) *
Какую виртуальную функцию виджета надо перехватить при наведении фокуса на визир?

если ты под фокусом понимаешь курсор мыши то.
это
enterEvent()
leaveEvent()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.7.2009, 13:03
Сообщение #3


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Еще вопрос: если я внес визир в компоновщик:
gridLayout -> addWidget(finder, 0, 0, 1, 1);

Я могу с помощью move() меня его положение? (Необходимо двигать по горизонтали)

/// Передвижение визира вслед за мышью
void VFFrame::mouseMoveEvent(QMouseEvent* events)
{
// ........................................
move(events -> pos());
}

Если нет, то как заставить его появиться на форме?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 16.7.2009, 13:13
Сообщение #4


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

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

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




Репутация:   23  


Цитата(AD @ 16.7.2009, 14:03) *
Я могу с помощью move() меня его положение? (Необходимо двигать по горизонтали)

я так понял что это вопрос.
ну не знаю предполагаю что нет.
напиши небольшой тестик и посмотри.:)
Цитата(AD @ 16.7.2009, 14:03) *
void VFFrame::mouseMoveEvent(QMouseEvent* events) { // ........................................ move(events -> pos()); }

опять же предполагаю что это не совсем красиво. будет.
координаты мыши и левого верхнего угла визира не совпадают же.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.7.2009, 13:59
Сообщение #5


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kwisp @ 16.7.2009, 14:13) *
опять же предполагаю что это не совсем красиво. будет.
координаты мыши и левого верхнего угла визира не совпадают же.

Так уже сделал. Ничего не двигается. А как добиться, чтобы в скомпонованном окне стал это визир, нескомпонованный (т.е. не добавлен в компоновщик с помощью addWidget), виден?

Вот такой код:
/// Создание и отображение вертикального визира
void GraphicDisplay::verticalViewfinder()
{
    if(v_viewfinderAction -> isChecked())
    {
        VFFrame* finder(new VFFrame(paramsDisplay, QFrame::VLine));
        finder -> setGeometry(140, 140, 16, 400);
        //gridLayout -> addWidget(finder, 0, 0, 1, 1);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 16.7.2009, 14:38
Сообщение #6


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

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

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




Репутация:   23  


Цитата(AD @ 16.7.2009, 14:59) *
Так уже сделал. Ничего не двигается. А как добиться, чтобы в скомпонованном окне стал это визир, нескомпонованный (т.е. не добавлен в компоновщик с помощью addWidget), виден?

жуть какаято.
а просто отдельным окном его никак нельзя сделать.
двигай куда хочешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.7.2009, 14:57
Сообщение #7


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kwisp @ 16.7.2009, 15:38) *
жуть какаято.
а просто отдельным окном его никак нельзя сделать.
двигай куда хочешь.

В смысле? Это как? Мне необходимо, чтобы при делании что-то с визиром, были определенные результаты у виджета? Ну т.е. взаимосвязь была... Понимаешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 16.7.2009, 15:02
Сообщение #8


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

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

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




Репутация:   23  


AD,
что мешает сделать его членом класса виджета но не давать ему parenta он как окно будет самостоятельным:) и взаимосвязь будет на уровне членов класса.
в конце концов можно где нить выше по иеррархии отдать указатель на визор виджету.
ну как бы тут вариантов куча.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.7.2009, 15:33
Сообщение #9


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Ну с этим вроде разобрался. Я не понимаю двух вещей. Как заставить принимать размеры визира во вертикали те же, что и окна? И как указать мыши, что мы в данной точке сфокусированы на визире, а не на виджете (у QEvent нет функции pos())?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 16.7.2009, 15:45
Сообщение #10


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

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

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




Репутация:   23  


AD,
какие-то концептуальные непонимания.
resizeEvent() виджета переопредели в нем напиши визиру принять высоту виджета и всё.
Цитата(AD @ 16.7.2009, 16:33) *
И как указать мыши, что мы в данной точке сфокусированы на визире, а не на виджете (у QEvent нет функции pos())?

не пойму вопроса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 24.7.2019, 8:19