Как вы строите точки в QT? - PullRequest
5 голосов
/ 18 октября 2011

Я пишу приложение на C ++ с QT, где у вас есть n точек, и вычислим выпуклую оболочку этого. Однако, как только это вычислено, я понятия не имею, как построить точки и нарисовать границу корпуса. Создание кнопок меню и тому подобное достаточно просто, но я не уверен, что знаю инструменты для этого.

Как ты это делаешь?

Ответы [ 4 ]

11 голосов
/ 20 октября 2011

Графика, addEllipse

QGraphicsView очень хорошо работает с 2D-графикой и дает вам много возможностей для ее отображения. Он не настолько приспособлен для построения научных данных, как qwt, но просто для отображения набора точек, геометрии, анимации и многих других вещей, он работает очень хорошо. См. Документацию и примеры Qt's Graphics View Framework .

Вот как вы строите группу точек в QGraphicsScene и показываете ее в 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();
}

Примечание: вы, вероятно, захотите вызвать setSceneRect на вашем виде, в противном случае сцена просто автоматически отцентрирует его. Прочитайте описания для QGraphicsScene и QGraphicsView в документации Qt. Вы можете масштабировать вид, чтобы показать более или менее сцену, и в него можно поместить полосы прокрутки. Я ответил на связанный вопрос , где я показываю больше о том, что вы можете сделать с QGraphicsView, который вам может понадобиться смотреть также.

5 голосов
/ 18 октября 2011

Вы можете просто создать собственный класс, производный от QWidget, где вы переопределяете метод void paintEvent(QPaintEvent* event).Таким образом, вы помещаете точки в какой-то список точек, либо std::vector<QPoint>, либо QList<QPoint>, а затем рисуете их методом PolylineНапример:

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()));
}
2 голосов
/ 18 октября 2011

Существует библиотека графиков, qwt , которая предоставляет виджеты Qt для ... графиков.

0 голосов
/ 07 июля 2018

Диаграммы Qt, QML или GraphicsView

Это должно было стать обновлением моего примера QGraphics View, но оно получилось довольно длинным, и это действительно совершенно другой способ ответить на вопрос.

Qt Charts (LGPL доступен с 2016 года) - отличный способ сделать это без сторонней библиотеки.

https://doc.qt.io/qt-5/qlineseries.html#QLineSeries

QLineSeries* series = new QLineSeries();
series->append(0, 6);
series->append(2, 4);
...
chart->addSeries(series);

В частности, для примера с выпуклой оболочкой вам, вероятно, понадобится диаграмма QAreaSeries.

https://doc.qt.io/qt-5/qtcharts-areachart-example.html
https://doc.qt.io/qt-5/qareaseries.html

QLineSeries *series0 = new QLineSeries();
QLineSeries *series1 = new QLineSeries();
*series0 << QPointF(1, 5) << QPointF(3, 7) << QPointF(7, 6) << QPointF(9, 7) << QPointF(12, 6)
         << QPointF(16, 7) << QPointF(18, 5);
*series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) << QPointF(12, 3)
         << QPointF(16, 4) << QPointF(18, 3);
QAreaSeries *series = new QAreaSeries(series0, series1);

Надеюсь, что поможет.

...