示例1
Qt画一个全方位雷达扫描
#include <QPainter>
#include <QWidget>
#include <QTimer>
#include <qmath.h>
#include <QApplication>
class Radar : public QWidget {
public:
Radar(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *event);
private:
QTimer *timer;
float angle;
};
Radar::Radar(QWidget *parent)
: QWidget(parent), angle(0) {
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(10); // 每10毫秒进行一次更新
}
void Radar::paintEvent(QPaintEvent * /* event */) {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制雷达扫描区域
painter.setPen(QColor("#00ff00"));
painter.drawEllipse(10, 10, width() - 20, height() - 20);
// 绘制雷达扫描线
painter.setPen(QColor("#ff0000"));
painter.drawLine(width() / 2, height() / 2,
width() / 2 + (width() - 20) / 2 * qCos(qDegreesToRadians(angle)),
height() / 2 + (height() - 20) / 2 * qSin(qDegreesToRadians(angle)));
// 绘制雷达扫描中心点
painter.setBrush(QColor("#ff0000"));
painter.drawEllipse(width() / 2 - 5, height() / 2 - 5, 10, 10);
angle = (angle + 1) ;// 更新雷达扫描角度
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Radar radar;
radar.setWindowTitle("radar");
radar.resize(400, 400);
radar.show();
return app.exec();
}
使用QPainter在paintEvent中绘制雷达扫描区域、雷达扫描线和雷达扫描中心点。使用QTimer定时更新雷达扫描角度。在main函数中创建Radar对象并显示。
示例2
复杂的全方位雷达扫描,具体步骤如下:
创建一个Qt项目,并添加一个主窗口。
新建Qt Widgets Application项目,添加MainWindow类。
在主窗口上添加一个QGraphicsView控件,用于绘制雷达扫描。
在MainWindow类的构造函数中添加以下代码:
QGraphicsView *view = new QGraphicsView(this);
view->setGeometry(20, 20, 400, 400);
- 创建一个QGraphicsScene对象,并将其设置为QGraphicsView的场景。
在MainWindow类的构造函数中添加以下代码:
QGraphicsScene *scene = new QGraphicsScene(this);
view->setScene(scene);
- 在QGraphicsScene中添加一个QGraphicsEllipseItem对象,用于表示雷达扫描的圆形区域。
在MainWindow类的构造函数中添加以下代码:
QGraphicsEllipseItem *circle = new QGraphicsEllipseItem(0, 0, 400, 400);
circle->setPen(QPen(Qt::NoPen));
circle->setBrush(QBrush(Qt::white));
circle->setZValue(-1);
scene->addItem(circle);
- 在QGraphicsScene中添加一些QGraphicsLineItem对象,用于表示雷达扫描的扫描线。
在MainWindow类的构造函数中添加以下代码:
for (int i = 0; i < 180; i += 10) {
QLineF line(200, 200, 200 + 200 * cos(i * M_PI / 180),
200 - 200 * sin(i * M_PI / 180));
QGraphicsLineItem *scanLine = new QGraphicsLineItem(line);
scanLine->setPen(QPen(Qt::red, 2));
scanLine->setRotation(-i);
scanLine->setZValue(1);
scene->addItem(scanLine);
}
- 在QGraphicsScene中添加一个QGraphicsPolygonItem对象,用于表示雷达扫描的中心点。
在MainWindow类的构造函数中添加以下代码:
QPointF points[3] = { QPointF(200, 200),
QPointF(195, 190),
QPointF(205, 190) };
QGraphicsPolygonItem *center = new QGraphicsPolygonItem(QPolygonF(points, 3));
center->setPen(QPen(Qt::NoPen));
center->setBrush(QBrush(Qt::red));
center->setTransformOriginPoint(200, 200);
center->setZValue(2);
scene->addItem(center);
- 在主窗口的槽函数中更新雷达扫描的扫描线的旋转角度。
在MainWindow类中添加以下私有成员变量:
int angle;
在MainWindow类的构造函数中添加以下代码:
angle = 0;
在MainWindow类中添加以下槽函数:
void MainWindow::updateScanLine() {
angle += 10;
angle %= 360;
QList<QGraphicsItem*> items = ui->graphicsView->scene()->items();
for (int i = 0; i < items.size(); i++) {
QGraphicsLineItem *line = dynamic_cast<QGraphicsLineItem*>(items[i]);
if (line) {
line->setRotation(line->rotation() + 10);
}
}
}
- 使用QGraphicsBlurEffect对象,对雷达扫描的圆形区域进行模糊处理,以增强立体感。
在MainWindow类的构造函数中添加以下代码:
QGraphicsBlurEffect *effect = new QGraphicsBlurEffect(this);
effect->setBlurRadius(10);
circle->setGraphicsEffect(effect);
- 使用QGraphicsOpacityEffect对象,对雷达扫描的中心点进行透明度处理,以增强立体感。
在MainWindow类的构造函数中添加以下代码:
QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect(this);
opacityEffect->setOpacity(0.5);
center->setGraphicsEffect(opacityEffect);
- 在主窗口中添加一个QTimer控件,定时更新雷达扫描的扫描线的旋转角度。
在MainWindow类的构造函数中添加以下代码:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateScanLine()));
timer->start(100);
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓