Рисование линии через mousePressEvent и mouseReleaseEvent

280
19 декабря 2016, 20:10

Всем привет)

Есть две кнопки на форме, QPushButton1 и QPushButton2. Мне надо нарисовать линию между кнопками. Т.е. нажали на кнопку QPushButton1 и нажатой навели на кнопку QPushButton2 и там отжали. И потом на форме должна рисоваться линия. Как это реализовать? Желательно после рисования линии QPushButton1 и QPushButton2 сбрасывались.

При отжатии QPushButton2 почему то реагирует только в своей области кнопки. Т.е. нажали на кнопку QPushBUtton2 и там же отжали, только так отжатие срабатывает.

1)Правильно ли делаю каждый раз update()?

2)Почему отжатие кнопки работает только в своей области?

Answer 1

Сам код

void Dialog::paintEvent(QPaintEvent *)
{
    if (_isBeingMouse1 &&_isBeingMouse2 == true)
    {
          QPainter p(this); // Создаём новый объект рисовальщика
          p.setPen(Qt::red);// Настройки рисования
          p.setBrush(Qt::white);// Настройки рисования
         // p.drawLine(10,10,100,100); // Рисование линии
//           painter->drawLine(firstTextWidget.geometry().center(),secondTextWidget.geometry().center());
    p.drawLine(ui->pushButton->geometry().center(),ui->pushButton_2->geometry().center());
    }
    else
    {
      //QPainter painter(this);
    //  qDebug()<< "text";
    }
}
void Dialog::on_pushButton_clicked()
{
    if(_isBeingMouse1 == true)
         _isBeingMouse1 = false;
    else
         _isBeingMouse1 = true;
  update();
}
void Dialog::on_pushButton_2_released()
{
    if(_isBeingMouse2 == true)
         _isBeingMouse2 = false;
    else
         _isBeingMouse2 = true;
    update();
}
Answer 2

Доброго времени суток!

По-поводу метода update() (из документации):

This function does not cause an immediate repaint; instead it schedules a paint event for processing when Qt returns to the main event loop. This permits Qt to optimize for more speed and less flicker than a call to repaint() does.

Исходя из этих слов от того что вы делаете update() в слоте обрабатывающем нажатие на кнопку, никакого особо эффекта, т.е. форма будет перерисована когда цикл сообщений дойдет до paintEvent(), в целом ничего страшного вы не делаете. Вызывать repaint() внутри paintEvent() крайне не рекомендуется (программа войдет в бесконечный цикл).

По поводу отжатия: если в двух словах, то так задумано самим фреймворком, то что вы хотите сделать лучше делать используя слот toggle() и свойства down, check и checked

Ну и наконец самое главное: посмотрите пример Diagram Scene Example из поставки Qt, там почти то что Вы хотите: рисование линий между двумя объектами (даже со стрелочками).

Я думаю, если заменить объекты, которые есть в примеры на наследников QGraphicsWidget или QGraphicsProxyWidget, то все должно получиться!

READ ALSO
Как заполнить массив данными из файла

Как заполнить массив данными из файла

Допустим есть файл со следующим содержанием

286
Не получается войти на FTP сервер

Не получается войти на FTP сервер

Здравствуйте! Пытаюсь написать FTP-клиент, столкнулся с трудностьюЧтобы зайти на ftp://87

266
IT компании для стажировки. [закрыто]

IT компании для стажировки. [закрыто]

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

247
Подключить библиотеку ws2_32.lib

Подключить библиотеку ws2_32.lib

Делаю прогу, которая должна парсить сайтПри использовании конструкции

707