Qt绘图深入解析:坐标系统与2D绘图实践

3星 · 超过75%的资源 需积分: 50 146 下载量 55 浏览量 更新于2024-09-19 3 收藏 247KB PDF 举报
"Qt坐标系详细讲解及2D绘图实践" 在Qt框架中,2D绘图是一个强大的功能,它允许开发者创建复杂的图形用户界面,包括自定义的图形元素。Qt的绘图系统基于坐标系,理解这个坐标系对于有效地绘制图形至关重要。在Qt中,坐标系的原点(0,0)位于窗口的左上角,x轴正方向向右,y轴正方向向下。这与数学中的标准笛卡尔坐标系略有不同。 实验八Qt中的绘图主要介绍了如何利用Qt的基本API进行画图。其中,`paintEvent(QPaintEvent*)`是关键的绘图函数,它会在窗口需要重绘时被调用。当窗口的某些部分需要更新时,Qt会发送一个`QPaintEvent`对象,开发者可以通过覆盖`paintEvent`方法来响应这个事件,执行实际的绘图操作。 在`drawdemo.h`的`protected`成员中,`paintEvent(QPaintEvent*)`函数用于处理所有的绘图任务。在这个函数内,开发者可以使用`QPainter`类提供的方法,如`drawLine`, `drawRect`, `drawPixmap`等,来进行线条、形状、文本甚至图像的绘制。 此外,实验还涉及到了缓存和定时器的概念。`buffer[200]`用于存储画图数据,这种做法提高了绘图效率,因为可以先在内存中准备图形,然后一次性地在屏幕上绘制。`QTimer`类用于实现定时更新或延迟操作。在示例代码中,`QTimer`的`timeout()`信号被连接到`flushBuff()`槽,当定时器触发时,这个槽函数会被调用,用于刷新缓存区的内容到屏幕。 `QTimer`的使用相当简单,通过`start()`方法启动定时器,并将`timeout()`信号连接到相应的槽函数。例如,创建一个2秒的单次触发定时器,可以这样写: ```cpp QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MyClass::timerDone); timer->start(2000, TRUE); // 2秒后触发一次,然后停止 ``` `QTimer::singleShot()`函数则提供了一种更简洁的方式来创建一次性触发的定时器,无需创建额外的对象。例如: ```cpp QTimer::singleShot(2000, this, SLOT(timerDone())); ``` 这个例子会在2000毫秒后直接调用`timerDone()`槽函数。 通过理解和掌握这些知识点,开发者能够利用Qt的绘图系统实现动态的、高效的图形界面,无论是简单的线条和形状,还是复杂的动画效果,都可以轻松实现。
2013-05-07 上传
该控件继承QWidget, 实现了左右上下四种形式的坐标轴控件。 可以设置固定间隔或自动选择间隔 可以设置最小间隔 开放一个槽来动态调整坐标轴的范围 处理了边缘刻度的显示 /************************************************************************ * 版权所有 (C) 2012-2015, liang1057@yahoo.com.cn 类声明: 坐标轴控件 ************************************************************************/ /** @brief 坐标轴控件 * * @details 坐标轴控件 只有刻度和数字,数字可以隐藏(用来显示其他需要显示的刻度值) */ class uiAxis : public QWidget { Q_OBJECT public: /** @brief 坐标轴类型 * * @details 坐标轴类型 */ enum AXISTYPE{ LEFT_AXIS = 0, TOP_AXIS, RIGHT_AXIS, BOTTOM_AXIS }; /** @brief 构造函数 */ uiAxis(AXISTYPE type = BOTTOM_AXIS, QWidget *parent = 0); /** @brief 析构函数 */ ~uiAxis(void); /** @brief 设置坐标轴的范围 */ void setScop(double minValue, double maxValue); /** @brief 获取坐标轴的范围 */ void getScop(double& minValue,double& maxValue); /** @brief 获取坐标轴的范围 */ double getMinValue(); double getMaxValue(); /** @brief 设置坐标轴的类型 */ void setAxisType(AXISTYPE type); /** @brief 坐标轴的类型 */ AXISTYPE getAxisType(); /** @brief 设置最小刻度(小刻度的最小间隔) */ void setMinInterval(double value); /** @brief 设置自动间隔 */ void setAutoScale(bool val=true); /** @brief 设置固定间隔 */ void setSettedScale(bool val=true); /** @brief 设置坐标轴的绘制范围, 像素值 */ void setBoundary(int left, int right, int top, int bottom); void getBoundary(int& left, int& right, int& top, int& bottom);