#include "mainwindow.h" #include "ui_mainwindow.h" #include"qpainter.h" #include"scanline.h" #include <QPointF> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setWindowState(Qt::WindowFullScreen); // setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint); showFullScreen(); //直线扫描转换菜单 myAc1 = new QAction(this); myAc1->setText(("DDA")); myAc1->setShortcut(QKeySequence("Ctrl+8")); //随意指定快捷方式 connect(myAc1, SIGNAL(triggered()), this, SLOT(pop1())); myAc2 = new QAction(this); myAc2->setText(("middle")); connect(myAc2, SIGNAL(triggered()), this, SLOT(pop2())); myAc3 = new QAction(this); myAc3->setText(("Bresnham")); connect(myAc3, SIGNAL(triggered()), this, SLOT(pop3())); lineMenu = menuBar()->addMenu(("LSSC"));//直线段扫描转换 lineMenu->addAction(myAc1); lineMenu->addAction(myAc2); lineMenu->addAction(myAc3); } MainWindow::~MainWindow() { delete ui; if (line != nullptr) { delete line; } } void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); // // 设置画笔颜色 painter.setPen(QColor(0, 160, 230)); // // 绘制直线 //// painter.drawLine(QPointF(ScanLine())); if(menunum==1)//微分绘线 { line=new ScanLine(); QPointF end = line->DDALine(30, 10, 10, 30); painter.drawLine(QPointF(30, 10), end); update(); } else if(menunum==2)//中点绘线 { line=new ScanLine(); QPointF end = line->MidLine(30, 10, 10, 30); painter.drawLine(QPointF(30, 10), end); update(); } else if(menunum==3)//brenham { line=new ScanLine(); QPointF end = line->Bresenham(30, 10, 10, 30); painter.drawLine(QPointF(30, 10), end); update(); } }还是无法显示出画的直线
时间: 2024-01-28 19:05:36 浏览: 152
根据你的代码,可以看出在`paintEvent`函数中,你使用了ScanLine类来绘制直线。但是,你没有给出ScanLine类的代码,所以我无法确定是否存在问题。同时,你使用了menunum变量来判断使用哪种直线绘制算法,但是我没有找到相关的menunum变量的定义和修改。因此,我建议你检查ScanLine类的代码是否正确,并且确保menunum变量的值被正确修改。
相关问题
画出GraphItem类的UML类图: #ifndef GRAPHITEM_H #define GRAPHITEM_H #include <QGraphicsItem> #include <QVector> #include <QPointF> #include <QtMath> #include <QTimer> #include <QPaintEvent> #include <QPushButton> #include "mainwindow.h" #include <QObject> class MainWindow; // 前向声明 class GraphItem : public QGraphicsItem { public: //构造函数,接受带权无向图临界矩阵adjMatrix和一个parent GraphItem(const QVector<QVector<int>> &adjMatrix, const QVector<int> &shortestPath, QGraphicsItem *parent = nullptr); //纯虚函数,在.cpp中重新编写以实现图形项的边界框绘制 QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; QVector<QPointF> m_nodePositions;//存储节点的位置信息 QVector<int> m_shortestPath; // 最短路径 QVector<int> m_userCity; QVector<int> m_userSchool; bool m_drawArrow; // 是否需要绘制箭头 bool m_draw1; bool m_draw2; bool m_draw3; private: MainWindow * m_mainWindow; // 指向MainWindow对象的指针 QVector<QVector<int>> m_adjMatrix;//存储带权无向图的邻接矩阵 QPointF startPoint; QPointF endPoint; QPainter * m_painter; QPainter * m_drawNodes; void initializeNodePositions();//初始化节点位置信息 void drawEdges(QPainter * painter);//用于绘制边 void drawNodes1(QPainter * painter);//用于绘制节点 void drawNodes2(QPainter * painter);//用于绘制节点 void drawNodes3(QPainter * painter);//用于绘制节点 void paintArrow(QPainter * painter); }; #endif // GRAPHITEM_H
抱歉,我无法直接绘制UML类图,但我可以为您解释这个类的结构。
GraphItem是一个继承自QGraphicsItem的类,用于在图形界面中绘制带权无向图。它具有以下成员变量和函数:
- 成员变量:
- m_nodePositions: 存储节点的位置信息的QVector<QPointF>。
- m_shortestPath: 存储最短路径的QVector<int>。
- m_userCity: 存储用户城市信息的QVector<int>。
- m_userSchool: 存储用户学校信息的QVector<int>。
- m_drawArrow: 一个布尔值,表示是否需要绘制箭头。
- m_draw1、m_draw2、m_draw3: 布尔值,表示是否需要绘制不同类型的节点。
- m_mainWindow: 指向MainWindow对象的指针。
- m_adjMatrix: 存储带权无向图的邻接矩阵的QVector<QVector<int>>。
- startPoint、endPoint: 起点和终点的坐标。
- m_painter、m_drawNodes: QPainter对象指针,用于绘制节点和边。
- 成员函数:
- 构造函数:接受带权无向图临界矩阵adjMatrix和一个parent对象。
- boundingRect():重写的纯虚函数,用于绘制图形项的边界框。
- paint():重写的纯虚函数,用于绘制图形项。
- initializeNodePositions():初始化节点位置信息。
- drawEdges():绘制边的函数。
- drawNodes1()、drawNodes2()、drawNodes3():用于绘制不同类型的节点。
- paintArrow():绘制箭头的函数。
这就是GraphItem类的基本结构。注意,该类使用了Qt库中的一些类和方法来实现绘图功能。
#include"scanline.h" #include"qpainter.h" #include<QDebug> #include "mainwindow.h" #include "ui_mainwindow.h" ScanLine::ScanLine() { } void ScanLine::DDALine(QPainter* painter,int x0,int y0,int x1,int y1) { int x; float dy,dx,k,y; dx=x1-x0; dy=y1-y0; y=y0; k=dy/dx; for(x=x0;x<=x1;x++) { painter->drawPoint(x,int(y+0.5)); y+=k; } painter->drawLine(x0,y0,x1,y1); }以上函数无法被 MainWindow::~MainWindow() { delete ui; } void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); // // 设置画笔颜色 painter.setPen(QColor(0, 160, 230)); // // 绘制直线 //// painter.drawLine(QPointF(ScanLine())); if(menunum==1)//微分绘线 { line=new ScanLine(); line->DDALine(&painter, 30, 10, 10, 30); update(); }调用的解决办法
首先,需要修改ScanLine类的DDALine函数的返回值,让它返回一个QPointF类型的值,表示绘制直线的起点和终点坐标。修改后的代码如下:
```cpp
#include "scanline.h"
#include <QPointF>
ScanLine::ScanLine() {}
QPointF ScanLine::DDALine(int x0, int y0, int x1, int y1) {
int x;
float dy, dx, k, y;
dx = x1 - x0;
dy = y1 - y0;
y = y0;
k = dy / dx;
for (x = x0; x <= x1; x++) {
y += k;
}
return QPointF(x0, y0) + QPointF(dx, dy);
}
```
然后在MainWindow的paintEvent函数中,调用DDALine函数获取绘制直线的起点和终点坐标,再使用QPainter的drawLine函数进行绘制。修改后的代码如下:
```cpp
void MainWindow::paintEvent(QPaintEvent *event) {
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QColor(0, 160, 230));
if (menunum == 1) {
line = new ScanLine();
QPointF end = line->DDALine(30, 10, 10, 30);
painter.drawLine(QPointF(30, 10), end);
update();
}
}
```
最后,在MainWindow的析构函数中,需要释放line对象的内存,修改后的代码如下:
```cpp
MainWindow::~MainWindow() {
delete ui;
if (line != nullptr) {
delete line;
}
}
```
阅读全文