2011-10-17 10 views
5

Estoy escribiendo una aplicación en C++ con QT donde tienes n puntos y calculo el casco convexo de esto. Sin embargo, una vez que esto se computa, no tengo idea de cómo trazar los puntos y dibujar el borde del casco. Hacer botones de menú y tal es bastante simple, pero no estoy seguro de que conozca las herramientas para hacerlo.¿Cómo trazas puntos en QT?

¿Cómo se hace esto?

+0

Posible duplicado de: Hacer una trama en Qt (http://stackoverflow.com/questions/1491362/making-plot-in-qt) – yasouser

Respuesta

4

Puede crear una clase personalizada derivada de QWidget donde anula el método void paintEvent(QPaintEvent* event). En eso pones los puntos en algún tipo de lista de puntos, ya sea std::vector<QPoint> o QList<QPoint> y luego lo pintas con un método Polyline. Por ejemplo:

void Foo::paintEvent(QPaintEvent* event) 
{ 
    QPainter painter(this); 
    std::vector<QPoint> points; 
    // Fill points with the points 
    painter.drawPolyLine(points.data(), static_cast<int>(points.size())); 
} 
+0

intenté esto, pero obtuve el error de compilación: 'QPainter pintor' tiene inicializador pero tipo incompleto ' –

2

Hay una biblioteca de gráficos, qwt, que proporciona widgets Qt para - erm - propósitos de gráficos.

+0

De hecho, me di cuenta de esto, pero espero hacerlo solo con QT , para fines de compatibilidad con algunos compañeros. –

+2

Puede compilar qwt directamente en su proyecto y está basado en Qt. No veo cómo esto afectaría la compatibilidad. – Chris

10

QGraphicsView hace 2D trazado muy bien y le da muchas opciones de cómo mostrarlo. No es tan adaptado para trazar datos científicos como qwt, pero solo por mostrar un montón de puntos, geometría o animaciones y muchas otras cosas, funciona muy bien. Consulte la documentación y ejemplos de Qt's Graphics View Framework.

Así es como trazas un montón de puntos en un QGraphicsScene y lo muestras en un QGraphicsView.

#include <QtGui/QApplication> 

#include <QGraphicsView> 
#include <QGraphicsScene> 
#include <QPointF> 
#include <QVector> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QVector <QPointF> points; 

    // Fill in points with n number of points 
    for(int i = 0; i< 100; i++) 
     points.append(QPointF(i*5, i*5)); 

    // Create a view, put a scene in it and add tiny circles 
    // in the scene 
    QGraphicsView * view = new QGraphicsView(); 
    QGraphicsScene * scene = new QGraphicsScene(); 
    view->setScene(scene); 

    for(int i = 0; i< points.size(); i++) 
     scene->addEllipse(points[i].x(), points[i].y(), 1, 1); 

    // Show the view 
    view->show(); 

    // or add the view to the layout inside another widget 

    return a.exec(); 
} 

Nota: es probable que desee llamar setSceneRect en su opinión, de lo contrario la escena se acaba de auto-centro de la misma. Lea las descripciones para QGraphicsScene y QGraphicsView en la documentación de Qt. Puede escalar la vista para mostrar más o menos de la escena y puede poner barras de desplazamiento. Respondí un question relacionado donde muestro más acerca de lo que puede hacer con un QGraphicsView que es posible que desee ver también.

Cuestiones relacionadas