Qt自定义个按钮鼠标放在按钮边缘就显示拉升如果拉大按钮,按钮跟随变化
时间: 2023-09-17 08:11:26 浏览: 127
你可以通过继承QPushButton类,重写其鼠标事件函数,实现该功能。具体步骤如下:
1. 定义一个新的类,继承QPushButton类。
2. 在类中定义一个QRect对象,用于记录按钮边缘区域。
3. 重写鼠标进入和移动事件,判断鼠标是否位于按钮边缘区域,如果是则改变鼠标光标,并显示拉伸效果。
4. 重写鼠标按下和移动事件,判断鼠标是否处于拉伸状态,如果是则根据鼠标移动距离改变按钮大小。
5. 重写鼠标释放事件,结束拉伸状态。
下面给出一个简单的示例代码,实现了上述功能:
```
class ResizableButton : public QPushButton
{
public:
ResizableButton(QWidget *parent = nullptr) : QPushButton(parent)
{
setCursor(Qt::ArrowCursor);
}
protected:
void enterEvent(QEvent *event) override
{
QRect rect = edgeRect();
if (rect.contains(mapFromGlobal(QCursor::pos())))
{
setCursor(Qt::SizeFDiagCursor);
m_isResizing = true;
}
}
void leaveEvent(QEvent *event) override
{
setCursor(Qt::ArrowCursor);
m_isResizing = false;
}
void mousePressEvent(QMouseEvent *event) override
{
if (m_isResizing)
m_startSize = size();
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (m_isResizing)
{
QSize delta = event->pos() - m_lastPos;
QSize newSize = m_startSize + delta;
setFixedSize(newSize);
}
m_lastPos = event->pos();
}
void mouseReleaseEvent(QMouseEvent *event) override
{
m_isResizing = false;
}
private:
QRect edgeRect() const
{
int margin = 5;
QRect rect = rect().adjusted(margin, margin, -margin, -margin);
rect.moveTopLeft(mapToGlobal(rect.topLeft()));
return rect;
}
bool m_isResizing = false;
QPoint m_lastPos;
QSize m_startSize;
};
```
在上述代码中,edgeRect()函数用于计算按钮边缘区域,m_isResizing、m_lastPos和m_startSize变量分别记录拉伸状态、鼠标最后位置和拉伸开始时的按钮大小。在鼠标移动事件中,根据鼠标移动距离计算新的按钮大小,并调用setFixedSize()函数设置大小。注意,这里使用setFixedSize()函数而不是resize()函数,是为了避免按钮大小超出边缘区域。
阅读全文