МС
Максим Смирнов28 июля 2016 г. 4:56

Редактор форм

move, QPushButton, Qt, изменение размера, перемещение

Как можно на панели курсором перемещать кнопку и изменять ее размеры?
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

2
Evgenii Legotckoi
  • 28 июля 2016 г. 5:59
  • Ответ был помечен как решение.

Уточните вопрос.
Это Вам необходимо реализовать в уже готовом приложении? Или Вы спрашиваете по поводу Дизайнера форм в Qt Creator?

Если второе, закидываете на панель без Layout кнопку и позиционируете курсором как Вам нужно. Главное, чтобы кнопка лежала не в Layout, иначе там будут свои правила позиционирования.

Если первое, то я Вам приведу вариант кода, как сделать перемещение кнопки, зажав правую кнопку мыши.

За более подробным примером с изменениями размера виджета (Кнопка по сути является обычным виджетом) я Вас отправлю в статью по кастомизации приложения в стиле AIMP, поскольку не хотел бы повторяться, да и это довольно объёмный материал. Там хорошо показан вариант с изменениями размера виджета, Вам нужно будет лишь портировать необходимую часть кода для кнопки.

Пример кода для перемещения кнопки внутри виджета
widget.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
 
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
private:
    Ui::Widget *ui;
};
 
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "movebutton.h"
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    MoveButton *moveButton = new MoveButton(this);
    moveButton->setGeometry(QRect(50,50,200,32));
    moveButton->setText("Move Button");
}
 
Widget::~Widget()
{
    delete ui;
}

movebutton.h

#ifndef MOVEBUTTON_H
#define MOVEBUTTON_H
 
#include <QObject>
#include <QPushButton>
#include <QMouseEvent>
 
class MoveButton : public QPushButton
{
    Q_OBJECT
    Q_PROPERTY(QPoint previousPosition READ previousPosition WRITE setPreviousPosition NOTIFY previousPositionChanged)
 
public:
    explicit MoveButton(QWidget *parent = 0);
 
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    QPoint previousPosition() const;
 
signals:
    void previousPositionChanged(QPoint previousPosition);
 
public slots:
    void setPreviousPosition(QPoint previousPosition);
 
private:
    bool m_rightMouseButtonPressed;
    QPoint m_previousPosition;
};
 
#endif // MOVEBUTTON_H

movebutton.cpp

#include "movebutton.h"
#include <QDebug>
 
MoveButton::MoveButton(QWidget *parent) : QPushButton(parent)
{
 
}
 
void MoveButton::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::RightButton) {
        m_rightMouseButtonPressed = true;
        setPreviousPosition(event->pos());
    }
    return QPushButton::mousePressEvent(event);
}
 
void MoveButton::mouseMoveEvent(QMouseEvent *event)
{
    if (m_rightMouseButtonPressed) {
        auto dx = event->x() - m_previousPosition.x();
        auto dy = event->y() - m_previousPosition.y();
        setGeometry(x() + dx, y() + dy, width(), height());
    }
    return QPushButton::mouseMoveEvent(event);
}
 
void MoveButton::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::RightButton)
        m_rightMouseButtonPressed = false;
    return QPushButton::mouseReleaseEvent(event);
}
 
QPoint MoveButton::previousPosition() const
{
    return m_previousPosition;
}
 
void MoveButton::setPreviousPosition(QPoint previousPosition)
{
    if (m_previousPosition == previousPosition)
        return;
 
    m_previousPosition = previousPosition;
    emit previousPositionChanged(previousPosition);
}

 

    Спасибо!

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь
      d
      • dsfs
      • 26 апреля 2024 г. 14:56

      C++ - Тест 004. Указатели, Массивы и Циклы

      • Результат:80баллов,
      • Очки рейтинга4
      d
      • dsfs
      • 26 апреля 2024 г. 14:45

      C++ - Тест 002. Константы

      • Результат:50баллов,
      • Очки рейтинга-4
      d
      • dsfs
      • 26 апреля 2024 г. 14:35

      C++ - Тест 001. Первая программа и типы данных

      • Результат:73баллов,
      • Очки рейтинга1
      Последние комментарии
      k
      kmssr9 февраля 2024 г. 5:43
      Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
      АК
      Анатолий Кононенко5 февраля 2024 г. 12:50
      Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
      EVA
      EVA25 декабря 2023 г. 21:30
      Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
      J
      JonnyJo25 декабря 2023 г. 19:38
      Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
      G
      Gvozdik19 декабря 2023 г. 8:01
      Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
      Сейчас обсуждают на форуме
      PS
      Peter Son4 мая 2024 г. 3:57
      Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
      Evgenii Legotckoi
      Evgenii Legotckoi3 мая 2024 г. 0:07
      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
      IscanderChe
      IscanderChe30 апреля 2024 г. 14:22
      Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
      G
      Gar22 апреля 2024 г. 15:46
      Clipboard Как скопировать окно целиком в clipb?
      Павел Дорофеев
      Павел Дорофеев14 апреля 2024 г. 12:35
      QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь

      Следите за нами в социальных сетях