QT 实现Label上画线

实现功能:Label上有一张图片,用画笔在图像上画线。

一、头文件添加以下函数和变量

     QMouseEvent * mouseEvent;
     void mousePressEvent(QMouseEvent* event);
     void mouseMoveEvent(QMouseEvent* event);
     void mouseReleaseEvent(QMouseEvent* event);
     void paintEvent(QPaintEvent *p);
     void posTrans(QPoint);//坐标转换

     QVector<QPoint> line;

二、源文件中实现以上函数

void Widget::paintEvent(QPaintEvent *event)//任何鼠标事件都会导致调用paintevent
{
    QPainter pen(&pix);//画笔设置在图像pix上,表示在图像中画线

    for (int i = 0;i<line.size()-1;i++)
    {
        pen.drawLine(line[i],line[i+1]);
    }

    ui->label->setPixmap(pix);


}

void Widget::mouseMoveEvent(QMouseEvent *event)//鼠标按下之后,移动事件才能触发
{
   posTrans(event->globalPos());//获取全局坐标
}

void Widget::mousePressEvent(QMouseEvent *event)
{

    posTrans(event->globalPos());
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{

    posTrans(event->globalPos());
    line.clear();//画完一条线之后清楚vector内容,便于下次装新的线

}


void Widget::posTrans(QPoint p)
{
     QPoint p0 = ui->label->mapFromGlobal(p);//图片填满label时可用
     //当图片未填满label时
     int xoffset = (ui->label->contentsRect().width()-ui->label->pixmap()->width())/2;
     int yoffset = (ui->label->contentsRect().height()-ui->label->pixmap()->height())/2;
     QPoint Pos0 = QPoint(p0.x()-xoffset,p0.y()-yoffset);
     line.push_back(Pos0);
}

三、效果

 

Qt中,你可以使用QPainter和QGraphicsView来实现Label上绘制Sin波形。首先,你需要创建一个QLabel作为画布,然后创建一个QGraphicsScene来管理图形元素。接下来,你可以通过下面的步骤来实现: 1. 导入必要的库: ```cpp #include <QApplication> #include <QWidget> #include <QLabel> #include <QGraphicsScene> #include <QGraphicsView> #include <QPainter> #include <cmath> ``` 2. 定义窗口和UI元素: ```cpp class MainWindow : public QWidget { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); private slots: void paintEvent(QPaintEvent* event); private: QLabel* m_label; }; ``` 3. 实现paintEvent函数,这是关键部分,用于在Label上绘画: ```cpp MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { m_label = new QLabel(this); m_label->setMinimumSize(400, 200); m_label->setMaximumSize(400, 200); // 创建QGraphicsScene QGraphicsScene scene(*this); // 设置场景为标签的背景 m_label->setScene(&scene); } void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(m_label); painter.setRenderHint(QPainter::Antialiasing, true); // 提高曲线平滑度 for (int y = -m_label->height() / 2; y <= m_label->height() / 2; y += 5) { // 绘制Y轴 painter.drawLine(0, y, m_label->width(), y); } const double xMax = static_cast<double>(m_label->width()); const int xStep = 10; for (double x = 0; x <= xMax; x += xStep) { double yValue = sin(x * M_PI / 180); // 将X轴转换为0-π范围并计算Sin值 painter.drawPoint(x, static_cast<int>(yValue * m_label->height())); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值