Qt:在widget的外部进行绘制带有坐标轴的图像

=====================================Widget.h=====================================

#ifndef WIDGET_H

#define WIDGET_H


#include <QWidget>


namespace Ui {

    class Widget;

}


class Widget : public QWidget {

    Q_OBJECT

public:

    Widget(QWidget *parent = 0);

    ~Widget();


protected:

    virtual void changeEvent(QEvent *e);

    virtual bool eventFilter(QObject *watched, QEvent *e);

    void paintOnWidget(QWidget *w);


private:

    Ui::Widget *ui;

};


#endif // WIDGET_H



=====================================Widget.cpp=====================================

#include "Widget.h"

#include "ui_Widget.h"

#include <QtGui/QPainter>


Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {

    ui->setupUi(this);

    ui->widget->installEventFilter(this);

}


Widget::~Widget() {

    delete ui;

}


void Widget::changeEvent(QEvent *e) {

    QWidget::changeEvent(e);

    switch (e->type()) {

    case QEvent::LanguageChange:

        ui->retranslateUi(this);

        break;

    default:

        break;

    }

}


bool Widget::eventFilter(QObject *watched, QEvent *e) {

    if (watched == ui->widget) {

        if (e->type() == QEvent::Paint) {

            paintOnWidget(ui->widget);

            return true;

        }

    }


    return QWidget::eventFilter(watched, e);

}


void Widget::paintOnWidget(QWidget *w) {

    QPainter painter(w);


    QFontMetrics metrics = painter.fontMetrics();

    int textHeight = metrics.ascent() + metrics.descent();


    int leftWidth = metrics.width(tr("9000")) + 5;

    int rightWidth = metrics.width(tr("()"));

    int width = w->size().width() - leftWidth - rightWidth;

    int height = w->size().height() - 3 * textHeight;


    // 绘制外框

    painter.drawRect(00, w->size().width() -1, w->size().height() - 1);

    // 移动坐标系

    //painter.translate(inset * 2, ui->yearWidget->size().height() - inset);

    painter.translate(leftWidth, 1.75 * textHeight + height);


    int totalCount = 9000// 默认每年收入9000件衣服

    int count = 10;        // 分成10

    float deltaX = width / 12.0f;         // x坐标上每分的宽度

    float deltaY = (float)height / count; // y坐标上每分的宽度



    // 画横坐标

    painter.drawLine(00, width, 0);

    for (int i = 1; i <= 12; ++i) {

        QString month = tr("%1").arg(i);

        int stringWidth = metrics.width(month);


        // 绘制坐标刻度

        painter.drawLine(deltaX * i, 0, deltaX * i, 4);


        // 绘制坐标处的月

        int monthX = deltaX * (i - 1) + ((deltaX - stringWidth) / 2);

        painter.drawText(monthX, textHeight, month);

    }


    // 画纵坐标

    painter.drawLine(000, -height);

    painter.drawText(-metrics.width(tr("()")),

                     -(deltaY * count + textHeight / 2 + metrics.descent()),

                     tr("()"));

    for (int i = 1; i <= count; ++i) {

        QString value = QString("%1").arg(i * totalCount / count);

        int stringWidth = metrics.width(value);


        // 绘制坐标刻度

        painter.drawLine(-4, -i * deltaY, 0, -i * deltaY);


        // 绘制坐标值

        //painter.drawText(-stringWidth - 4, -i * deltaY + stringHeight / 2, value);

        painter.drawText(-stringWidth - 4, -(deltaY * i + textHeight / 2 - metrics.ascent()), value);

    }


    //    // 绘制每个月收到的服饰

    //    painter.setBrush(Qt::BDiagPattern);

    //    for (int i = 0; i < yearList.size(); ++i) {

    //        painter.setPen(Qt::black);

    //        int fineryCount = yearList.at(i); // i + 1个月收到的服饰件数

    //        int h = fineryCount / (float)totalCount * height;

    //        painter.drawRect(deltaX * i + 2, 0, deltaX - 4, -h);

    //

    //        // 绘制收到的服饰件数

    //        QString fineryString = QString("%1").arg(fineryCount);

    //        int stringWidth = metrics.width(fineryString);

    //

    //        if (h > height) {

    //            h = height;

    //        }

    //

    //        painter.setPen(Qt::red);

    //        //painter.drawText(deltaX * i + (deltaX - stringWidth) / 2, -(h + metrics.descent()), fineryString);

    //    }

}




FRom;http://www.cppblog.com/biao/archive/2009/10/31/99896.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
添加一个QMainWindow窗口作为主界面: 1. 打开Qt Creator,创建一个新的Qt Widgets应用程序项目。 2. 在主窗口设计界面中,将一个QWidget部件拖到主窗口的中央区域。 3. 右键单击主窗口,在弹出的菜单中选择“添加菜单栏”。 4. 在添加的菜单栏中添加一个菜单,并添加一个动作。 5. 将动作与QWidget部件中绘制函数图像的槽函数连接起来。 添加QWidget用于绘制函数图像: 1. 在Qt Creator中,打开QWidget部件的头文件。 2. 在头文件中声明一个绘制函数图像的函数。 3. 在QWidget部件的源文件中实现绘制函数图像的函数。 4. 在QWidget部件的构造函数中设置QWidget部件的背景色为白色。 5. 重新实现QWidget部件的paintEvent方法,在其中绘制坐标轴和函数图像。 下面是一个简单的示例代码: ```cpp // mainwindow.h #include <QMainWindow> #include <QWidget> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void drawFunction(); private: QWidget *m_widget; }; // mainwindow.cpp #include "mainwindow.h" #include <QVBoxLayout> #include <QPainter> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { m_widget = new QWidget(this); setCentralWidget(m_widget); QVBoxLayout *layout = new QVBoxLayout(m_widget); layout->setMargin(0); m_widget->setLayout(layout); connect(this, &MainWindow::destroyed, m_widget, &QObject::deleteLater); } MainWindow::~MainWindow() { } void MainWindow::drawFunction() { // Do something to draw the function } class FunctionWidget : public QWidget { public: FunctionWidget(QWidget *parent = nullptr) : QWidget(parent) { setAutoFillBackground(true); setPalette(QPalette(Qt::white)); } protected: void paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); // Draw the coordinate system painter.drawLine(0, height() / 2, width(), height() / 2); painter.drawLine(width() / 2, 0, width() / 2, height()); // Draw the function // ... } }; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值