Qt实现矩形大小任意缩放的示例代码
现有功能
1.在窗口上绘制任意大小的矩形。
2.通过边角的拖曳按钮改变矩形大小。
运行结果
源码
point_button.h
#ifndef POINTBUTTON_H
#define POINTBUTTON_H
#include <QPushButton>
#include <QWidget>
#include <QMouseEvent>
class PointButton : public QPushButton
{
public:
PointButton(QWidget *parent);
~PointButton();
public:
bool isPressed; // 用来判断用户是否正按在拖曳按钮上
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
void setQss(); // 设置拖曳按钮样式
private:
float startX; // 用来移动拖曳按钮
float startY;
};
#endif // POINTBUTTON_H
point_button.cpp
#include "point_button.h"
#include <QString>
#include "window.h"
PointButton::PointButton(QWidget *parent): QPushButton(parent) {
this->resize(10, 10);
this->isPressed = false;
this->setQss();
}
PointButton::~PointButton() {
}
void PointButton::setQss() {
QString qss = "QPushButton {\n"
"border-radius: 5px;\n"
"border: 1px solid black;"
"background-color: rgb(255, 255, 255);\n"
"}\n"
"QPushButton:hover {\n"
"border-width: 2px;\n"
"}";
this->setStyleSheet(qss);
}
void PointButton::mousePressEvent(QMouseEvent *event) {
QPushButton::mousePressEvent(event);
this->startX = event->x();
this->startY = event->y();
this->isPressed = true;
}
void PointButton::mouseMoveEvent(QMouseEvent *event) {
QPushButton::mouseMoveEvent(event);
float disX = event->x() - this->startX;
float disY = event->y() - this->startY;
this->move(this->x()+disX, this->y()+disY);
Window *parent = (Window*) this->parent();
parent->changeSize();
}
void PointButton::mouseReleaseEvent(QMouseEvent *event) {
QPushButton::mouseReleaseEvent(event);
this->isPressed = false;
}
window.h
#ifndef WINDOW_H
#define WINDOW_H
#include <QWidget>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QPen>
#include "point_button.h"
class Window : public QWidget
{
Q_OBJECT
public:
Window(QWidget *parent = nullptr);
~Window();
void changeSize(); // 改变矩形尺寸
void hideCornerBtns(); // 隐藏边角拖曳按钮
void showCornerBtns(); // 设置边角拖曳按钮位置并显示
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
private:
int x1; // x1和y1是矩形左上角坐标
int y1;
int x2; // x2和y2是矩形右下角坐标
int y2;
QPen pen;
PointButton *topLeftBtn;
PointButton *topRightBtn;
PointButton *bottomLeftBtn;
PointButton *bottomRightBtn;
};
#endif // WINDOW_H
window.cp
#include "window.h"
#include <Qt>
#include <QPainter>
#include <QDebug>
Window::Window(QWidget *parent): QWidget(parent) {
this->pen = QPen(Qt::black);
this->topLeftBtn = new PointButton(this);
this->topRightBtn = new PointButton(this);
this->bottomLeftBtn = new PointButton(this);
this->bottomRightBtn = new PointButton(this);
this->x1 = float(NULL);
this->y1 = float(NULL);
this->x2 = float(NULL);
this->y2 = float(NULL);
this->hideCornerBtns();
}
Window::~Window() {
}
void Window::mousePressEvent(QMouseEvent *event) {
QWidget::mousePressEvent(event);
this->x1 = float(NULL);
this->y1 = float(NULL);
this->x2 = float(NULL);
this->y2 = float(NULL);
this->hideCornerBtns();
this->x1 = event->x();
this->y1 = event->y();
this->update();
}
void Window::mouseMoveEvent(QMouseEvent *event) {
QWidget::mouseMoveEvent(event);
if (this->topLeftBtn->isPressed || this->topRightBtn->isPressed ||
this->bottomLeftBtn->isPressed || this->bottomRightBtn->isPressed)
return;
this->x2 = event->x();
this->y2 = event->y();
this->update();
}
void Window::paintEvent(QPaintEvent *event) {
QWidget::paintEvent(event);
if (this->x1==float(NULL) || this->y1==float(NULL) || this->x2==float(NULL) || this->y2==float(NULL)) {
return;
}
QPainter painter(this);
painter.setPen(this->pen);
int width = this->x2 - this->x1;
int height = this->y2 - this->y1;
painter.drawRect(this->x1, this->y1, width, height);
this->showCornerBtns();
}
void Window::hideCornerBtns() {
this->topLeftBtn->hide();
this->topRightBtn->hide();
this->bottomLeftBtn->hide();
this->bottomRightBtn->hide();
}
void Window::showCornerBtns() {
int halfWidth = int(this->topLeftBtn->width() / 2);
int halfHeight = int(this->topLeftBtn->height() / 2);
this->topLeftBtn->move(this->x1-halfWidth, this->y1-halfHeight);
this->topRightBtn->move(this->x2-halfWidth, this->y1-halfHeight);
this->bottomLeftBtn->move(this->x1-halfWidth, this->y2-halfHeight);
this->bottomRightBtn->move(this->x2-halfWidth, this->y2-halfHeight);
this->topLeftBtn->show();
this->topRightBtn->show();
this->bottomLeftBtn->show();
this->bottomRightBtn->show();
}
void Window::changeSize() {
if (this->topLeftBtn->isPressed) {
this->x1 = int(this->topLeftBtn->x() + this->topLeftBtn->width()/2);
this->y1 = int(this->topLeftBtn->y() + this->topLeftBtn->height()/2);
}
else if (this->topRightBtn->isPressed) {
this->x2 = int(this->topRightBtn->x() + this->topRightBtn->width()/2);
this->y1 = int(this->topRightBtn->y() + this->topRightBtn->height()/2);
}
else if (this->bottomLeftBtn->isPressed) {
this->x1 = int(this->bottomLeftBtn->x() + this->bottomLeftBtn->width()/2);
this->y2 = int(this->bottomLeftBtn->y() + this->bottomLeftBtn->height()/2);
}
else if (this->bottomRightBtn->isPressed) {
this->x2 = int(this->bottomRightBtn->x() + this->bottomRightBtn->width()/2);
this->y2 = int(this->bottomRightBtn->y() + this->bottomRightBtn->height()/2);
}
this->update();
}
main.cpp
#include "window.h"
#include <QApplication>
int main(int arGC, char *argv[])
{
QApplication a(argc, argv);
Window w;
w.show();
return a.exec();
}
以上就是Qt实现矩形大小任意缩放的示例代码的详细内容,更多关于Qt矩形任意缩放的资料请关注其它相关文章!
相关文章