QT_放大与缩小按钮

头文件: painttest.h

#ifndef PAINTTEST_H

#define PAINTTEST_H
#include <QtGui/QWidget>
#include <QPushButton>
class PaintTest : public QWidget
{
    Q_OBJECT
private:
    QPixmap pix;
    QPoint lastPoint;
    QPoint endPoint;
    int scale;
    QPushButton *pushBtn;
    QPushButton *pushBtn1;
public:
    PaintTest(QWidget *parent = 0);
    ~PaintTest();
protected:
    void paintEvent(QPaintEvent *);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
private slots:
  void zoomIn();
  void zoomOut();
};
#endif // PAINTTEST_H

painttest.cpp
#include "painttest.h"
#include <QPainter>
#include <QPixmap>
#include <QDebug>
#include <QMouseEvent>
#include <QPushButton>
PaintTest::PaintTest(QWidget *parent)
    : QWidget(parent)
{
    resize(600,500); //窗口大小设置为600*500
    pix=QPixmap(200,200);
    pix.fill(Qt::green);
    scale =1; //设置初始放大倍数为1,即不放大
    pushBtn = new QPushButton(this); //新建按钮对象
    pushBtn->setText(tr("zoomIn")); //设置按钮显示文本
    pushBtn->move(200,150); //设置按钮放置位置
    connect(pushBtn,SIGNAL(clicked()),this,SLOT(zoomIn())); //对按钮的单击事件和其槽函数进行关联
    pushBtn1 = new QPushButton(this); //新建按钮对象
    pushBtn1->setText(tr("zoomOut")); //设置按钮显示文本
    pushBtn1->move(300,150); //设置按钮放置位置
    connect(pushBtn1,SIGNAL(clicked()),this,SLOT(zoomOut())); //对按钮的单击事件和其槽函数进行关联
}
PaintTest::~PaintTest()
{
}
void PaintTest::mousePressEvent(QMouseEvent *event)
{
    //qDebug() << event->pos();
    if(event->button()==Qt::LeftButton) //鼠标左键按下
    lastPoint = event->pos();
}
void PaintTest::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton) //鼠标左键按下的同时移动鼠标
{
endPoint = event->pos();
update();
}
}
void PaintTest::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton) //鼠标左键释放
{
endPoint = event->pos();
update();
}
}
void PaintTest::paintEvent(QPaintEvent *)
{
    QPainter pp(&pix);
    pp.drawLine(lastPoint,endPoint);
    lastPoint = endPoint; //让前一个坐标值等于后一个坐标值,这样就能实现画出连续的线
    QPainter painter(this);
    painter.scale(scale,scale); //进行放大操作
    painter.drawPixmap(0,0,pix);
}
void PaintTest::zoomIn() //按钮单击事件的槽函数
{
scale *=2;
update();
}
void PaintTest::zoomOut() //按钮单击事件的槽函数
{
scale *=0.5;
update();
}
mian.cpp
#include <QtGui/QApplication>
#include "painttest.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    PaintTest w;
    w.resize(400,400);
    w.show();
    return a.exec();
}
### Qt 中自定义标题栏的最小化和最大化按钮 当去除默认标题栏并创建自定义标题栏时,在Qt中实现最小化和最大化的功能需要手动编写相应逻辑。对于最小化操作,`Widget::showMinimized()` 函数可以直接用于将窗口缩小到任务栏[^1]。 针对最大化恢复原状的操作,则需引入 `isMaximized()` 方法来检测当前窗口状态,并据此调整行为: - 如果窗口处于正常大小,则调用 `showMaximized()` 进行全屏展示; - 若已最大化,则通过 `showNormal()` 来恢复正常尺寸。 此外,为了给用户提供直观反馈,建议同步更新按钮上的图标,使其能够准确反映即将执行的动作——即点击前后的变化应清晰可见。 下面是一个简单的代码片段展示了如何处理这些事件以及切换图标的例子: ```cpp void Widget::on_btn_minimize_clicked() { this->showMinimized(); } void Widget::on_btn_maximize_restore_clicked() { if (this->isMaximized()) { this->showNormal(); ui->btn_maximize_restore->setIcon(QIcon(":/icons/maximize_icon.png")); // 设置为最大化图标 } else { this->showMaximized(); ui->btn_maximize_restore->setIcon(QIcon(":/icons/restore_icon.png")); // 设置为还原图标 } } ``` 值得注意的是,在移除标准标题栏之后可能会遇到一些布局方面的问题,比如最大化状态下覆盖住屏幕底部的任务栏。对此可以通过设置合适的窗口标志位或采用第三方库如 GitHub 上提到的一个优秀解决方案[^3]来进行优化[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值