Всем привет)
Есть две кнопки на форме, QPushButton1 и QPushButton2. Мне надо нарисовать линию между кнопками. Т.е. нажали на кнопку QPushButton1 и нажатой навели на кнопку QPushButton2 и там отжали. И потом на форме должна рисоваться линия. Как это реализовать? Желательно после рисования линии QPushButton1 и QPushButton2 сбрасывались.
При отжатии QPushButton2 почему то реагирует только в своей области кнопки. Т.е. нажали на кнопку QPushBUtton2 и там же отжали, только так отжатие срабатывает.
1)Правильно ли делаю каждый раз update()?
2)Почему отжатие кнопки работает только в своей области?
Сам код
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();
}
Доброго времени суток!
По-поводу метода 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, то все должно получиться!
Сборка персонального компьютера от Artline: умный выбор для современных пользователей