QPainter绘制罗盘

本文介绍如何利用Qt的QPainter组件绘制一个罗盘,并根据实时航向信息进行更新。通过重写paintEvent函数,设置参数,绘制背景、刻度、字符和指针,实现罗盘效果。同时,提供了一个update_compass()函数用于外部调用以更新罗盘显示,测试时可通过按钮使罗盘每点击一次逆时针旋转15°。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QPainter绘制罗盘

使用Qt中的QPainter绘制罗盘,根据实时航向信息改变,效果图如下(真的丑)。QPainter官方文档地址:

新建Qt设计师界面类Compass:

官方文档中给出QPainter的一般使用方法:重写paintEvent函数,在该函数内完成绘图。

在compass.cpp文件中重写paintEvent:

void Compass::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    this->initParas();    //初始化绘图参数
  
QPainterQt框架中用于绘图的核心类之一,它能够绘制各种图形、文本等内容到QWidget、QImage、QPixmap等设备上。直接用`QPainter`绘制表格并不是最常用的做法,因为有专门针对表格展示设计的组件如`QTableView`配合模型(Model)。但是,在某些自定义场景下确实需要借助于`QPainter`手动绘制。 以下是使用`QPainter`绘制简单表格的基本步骤: ### 一、准备工作 1. **创建绘画环境**:你需要一个可以用来画图的对象(比如窗口部件),并且在这个对象里面覆写它的`paintEvent()`函数——所有基于`QPainter`的绘制操作都应该放在这个事件处理程序里。 2. **实例化`QPainter`对象**:传入当前控件作为参数构造出一个画家对象,并开始在一个特定区域进行绘制工作。 ```cpp void MyWidget::paintEvent(QPaintEvent *event){ QPainter painter(this); // 创建了一个关联着this widget的QPainter对象 drawTable(&painter); } void MyWidget::drawTable(QPainter* p){ } ``` ### 二、绘制表格 接下来就是在上面提到的`drawTable`函数内部实现具体的表格绘制逻辑了: #### (一)设置颜色样式 你可以通过改变笔触(`setPen`)和填充色(`setBrush`)来自由控制线条以及单元格背景的颜色风格。 ```cpp p->setPen(Qt::black); // 设置黑色边框线 // 如果想要给单元格添加背景色的话还可以这样做: // QBrush brush(QColor(240, 255, 255)); // p->setBrush(brush); ``` #### (二)计算行列位置尺寸信息 假设我们已经知道了每行的高度(rowHeight)和列宽(columnWidth),那么就可以根据这些值确定每个矩形的位置大小。 ```cpp int rowHeight = 30; int columnWidth = 80; for(int row=0;row<rowCount;++row){ // 遍历所有的行 for(int col=0;col<columnCount;++col){ // 再遍历每一列 QRect rect(col*columnWidth+padding, row*rowHeight + padding, columnWidth-padding*2, rowHeight - padding*2); if(/* 某些条件判断是否高亮该单元格 */) p->fillRect(rect, QColor("lightGray")); p->drawRect(rect); // 绘制单个矩形单元格边界 } } ``` 这里注意加了个偏移量(padding),是为了避免紧挨着边缘看起来不舒服;同样地,你也可以根据实际情况调整这些数值使得布局更美观合理。 #### (三)渲染文字内容 最后别忘了往各个小方块儿里填字! ```cpp QStringList headers {"姓名","年龄","职业"}; ... if (row == 0 && col < headers.size()) { QString text = headers[col]; p->drawText(cellRect, Qt::AlignCenter | Qt::TextWordWrap ,text ); } else{ QTableWidgetItem item = ... ; // 填充实际数据项的方式取决于你的数据源组织形式 QString cellData=item.text(); p->drawText(cellRect, Qt::AlignCenter|Qt::TextWordWrap ,cellData ); } ``` 以上就是利用`QPainter`来手动画出一张基础表格的主要过程啦~当然这只是一个简化的例子,真实项目当中往往还需要考虑很多其他因素例如滚动条支持、选中状态反馈等等功能点哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值