С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 06.12.2020
Сообщений: 42
1

QFrame и событие MouseButtonRelease не дружат

08.01.2024, 04:33. Показов 1555. Ответов 7

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Мучаюсь с тем, чтобы заставить срабатывать событие MouseButtonRelease для объекта QFrame, на котором рисую мышью. Вот мой код:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
bool main_wnd::eventFilter(QObject *object, QEvent *event)
{
    QString s;
    QMouseEvent* e = (QMouseEvent*)event;
    bool leftbtn =  e->buttons() & Qt::LeftButton;
    if ((object == ui->frameDRAW) && (leftbtn))
    {
        if (event->type() == QEvent::MouseButtonPress)
        {
            if (polyLine.size() > 0)
                polyLine.clear();
            polyLine << QPoint(e->x(), e->y());
            timer.restart();
            ui->lblTimeValue->setText(getTimeInfo(timer.elapsed()));
            ui->lblMouseXYValues->setText(getMousePosInfo(e));
 
            s = getDataString(timer.elapsed(), e->x(), e->y());
            addDataStringToList(&sList, s, true);
        }
 
        if (event->type() == QEvent::MouseMove)
        {
            polyLine << QPoint(e->x(), e->y());
            ui->lblTimeValue->setText(getTimeInfo(timer.elapsed()));
            ui->lblMouseXYValues->setText(getMousePosInfo(e));
 
            s = getDataString(timer.elapsed(), e->x(), e->y());
            addDataStringToList(&sList, s, false);
            //
        }
 
        if (event->type() == QEvent::MouseButtonRelease)
        {
            polyLine << QPoint(e->x(), e->y());
            ui->lblTimeValue->setText(getTimeInfo(timer.elapsed()));
            ui->lblMouseXYValues->setText(getMousePosInfo(e));
 
            s = getDataString(timer.elapsed(), e->x(), e->y());
            addDataStringToList(&sList, s, false);
            if (!saveDataListToFile(&sList, "testTimeXY.csv"))
                QMessageBox::critical(NULL,QObject::tr("Увы"),tr("Файл не записан"));
            else
                QMessageBox::critical(NULL,QObject::tr("Ура!"),tr("Файл записан!!!"));
        }
    }
 
    QPainter p(ui->frameDRAW);
    p.begin(ui->frameDRAW);
    p.setPen(Qt::green);
    if (polyLine.size() > 1)
        p.drawPolyline(polyLine);
    p.end();
    ui->frameDRAW->update();
 
    return false;
}
В сети видел совет обойти эту проблему через использование переменной qt_button_down. Я потратил кучу времени,чтобы разобраться, как получить доступ к этой переменной. Но так и не разобрался.
Подскажите, пжл. вариант решение данной проблемы? Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2024, 04:33
Ответы с готовыми решениями:

QFrame и QGLWidget
Доброго времени суток! Помогите советом, пожалуйста! У меня есть виджет, содержащий графику...

Qframe.h no such file or directory
Здравствуйте, я начинающий пользователь QT. Использую QT 5.3.1 и QT Crator 3.1.2. Мне требуется...

QListView съедает QFrame
Если поместить QListView и QFrame в один лайаут (можно даже и в разные), то QListView занимает все...

QFrame и отрисовка вручную
Подскажите пожалуйста, каким образом можно отрисовать это окошко вручную? То есть если я хочу, что...

7
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
08.01.2024, 07:10 2
Цитата Сообщение от AndreyM74 Посмотреть сообщение
Подскажите, пжл. вариант решение данной проблемы? Спасибо.
Вот так работают все три события: MouseButtonPress,MouseButtonRelease и MouseMove. Это то что вам требовалось?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "MainWindow.h"
#include <QMouseEvent>
#include <QDebug>
#include <QFrame>
#include <QEvent>
 
class Filter:public QObject
{
    Q_OBJECT
public:
    explicit Filter(QObject* parent):QObject{parent}{
    }
    virtual ~Filter()=default;
    virtual bool eventFilter(QObject* obj,QEvent* event)override
    {
        auto mouseEventPtr {static_cast<QMouseEvent*>(event)};
        auto framePtr {static_cast<QFrame*>(obj)};
        if(framePtr && mouseEventPtr){
            if(mouseEventPtr->button() == Qt::LeftButton){
                if(mouseEventPtr->type()==QEvent::MouseButtonPress){
                    qDebug()<<"MousePress";
                    return true;
                }
                else if(mouseEventPtr->type()==QEvent::MouseButtonRelease){
                    qDebug()<<"MouseRelease";
                    return true;
                }
            }
            else if(mouseEventPtr->buttons() & Qt::LeftButton){
                if(mouseEventPtr->type()==QEvent::MouseMove){
                    qDebug()<<"MouseMove";
                    return true;
                }
            }
        }
        return false;
    }
};
 
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    auto framePtr {new QFrame};
    auto filterPtr {new Filter{framePtr}};
    framePtr->installEventFilter(filterPtr);
    setCentralWidget(framePtr);
}
#include "MainWindow.moc"
2
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
08.01.2024, 17:27 3
AndreyM74, лучше сделать кастомный класс от QFrame и переопределить там paintEvent(), где и рисовать свои линии.
В eventFilter() таким способом, как в шапке темы - будет рисование при возникновении любых событий, поступающих от любых обьектов, принадлежащих виджету, на который назначен ивентфильтр.
1
1 / 1 / 0
Регистрация: 06.12.2020
Сообщений: 42
08.01.2024, 18:15  [ТС] 4
Цитата Сообщение от insite2012 Посмотреть сообщение
Это то что вам требовалось?
insite2012, спасибо большое!
Я верю, что ваше решение работает. Но мне теперь надо разбираться, как это решение встроить в мой проект, который пока совсем небольшой. На главной форме уже имеются компоненты, в том числе и QFrame. Динамически создаваемых виджетов нету и в ближайшей перспективе не предвидится. На кнопки на тулбаре внимание можно не обращать - они не задействованы.
Не могли бы вы посмотреть на проект, который прикладываю к сообщению. Мне потом так будет проще разобраться, что к чему. Qt C++ я начал работать только полтора года назад.
Вложения
Тип файла: zip MouseMovement.zip (10.2 Кб, 5 просмотров)
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
08.01.2024, 23:09 5
AndreyM74, я скачал ваш проект, посмотрю отпишусь. Но совет выше очень дельный, сделайте свой холст и на нем рисуйте. И вообще я бы сразу посоветовал смотреть в строну QGraphicsView, более широкие возможности рисования.
2
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
09.01.2024, 01:44 6
Цитата Сообщение от insite2012 Посмотреть сообщение
QGraphicsView, более широкие возможности рисования
Вот кстати да! Где-то уже выкладывал похожие рисовалки и на виджетах, и на граф. сцене- лень искать

Проект тоже бегло посмотрел, там бесконечная рекурсия в 53 строчке, рефакторить лень...
Взял код уважаемого insite2012 из 2-го поста и добавил кастомный QFrame - получился йожек из бухенвальда, на гифке Код не выкладываю т.к. сложный он будет для понимания ТСу,- только запутает, наверное.
QFrame и событие MouseButtonRelease не дружат
2
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
09.01.2024, 07:24 7
Цитата Сообщение от sdf45 Посмотреть сообщение
Проект тоже бегло посмотрел, там бесконечная рекурсия в 53 строчке, рефакторить лень...
Аналогично, бегло взглянул (правда сначала написал к нему CMakeLists.txt, *.pro как то уж совсем попахивает вековой пылью), при запуске сразу идет бесконечный вывод в консоль. Думаю что унаследоваться от QFrame или задействовать QGraphicsFramework будет более корректным решением.
2
1 / 1 / 0
Регистрация: 06.12.2020
Сообщений: 42
09.01.2024, 12:41  [ТС] 8
insite2012, sdf45, благодарю за дискуссию! По крайней мере для меня она оказалась полезной.
Сегодня мне конкретизировали ТЗ, и после этого выбор в пользу QGraphicsFramework для меня стал очевиден на 100%.
А в качестве упражнения на досуге попробую унаследоваться от QFrame.
0
09.01.2024, 12:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2024, 12:41
Помогаю со студенческими работами здесь

QFrame не перерисовывается после ресайза
При ресайзе QFrame от содержимого остаётся как бы шлейф. Есть ли какой-то флаг автоматической...

Выпадающий список для QFrame
Есть кучка объектов QFrame, нужно при нажатии (например на Frame1) чтобы появлялось...

Изменения порядка child у QWidget(QFrame)
Здравствуйте Имеется форма, на которой растянут на весь экран QFrame (без Layout, важно!!) На ней...

Создание экземпляра QFrame произвольной формы
Есть такой вопрос. Как можно создать экземпляр QFrame ну допустим в форме ромба или например...

Изменения порядка children у QWidget(QFrame)
Здравствуйте Имеется форма, на которой растянут на весь экран QFrame(без layout) На ней создается...

Странная задержка после update в QFrame
Господа, занялся я тут одной работой &quot;своеобразной&quot;, переписываю программу картографии на С++ Qt....

Две ОС (7 и 8) не дружат
здравствуйте! ноутбук asus g55, стоит 2 ос, win-7 и win-8. грузятся через &quot;symon&quot;. два вопроса: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru