Как сохранить графику в центре главного окна - PullRequest
0 голосов
/ 28 сентября 2018

Я изучаю Qt5 и использую Qt 5.9.1.Теперь у меня есть проблема: как сохранить графику в центре главного окна, даже если размер главного окна изменяется?

В прошлом году я изучал MFC в своем классе, и учитель сказал нам, что для того, чтобыграфика всегда остается в окне, мы должны сделать следующее:

  1. Пусть начало области просмотра будет центром клиентской области;
  2. Пусть размер области просмотра будет размеромклиентская область;
  3. Пусть начало окна будет центром ограничивающего прямоугольника графики;
  4. Пусть размер окна будет размером ограничивающего прямоугольника графики.

Так что я делаю то же самое в Qt5:

// main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtGuiApplication1 w;
    // get the size and center of client area
    // and then pass the values to QtGuiApplication
    int width = QApplication::desktop()->availableGeometry().width();
    int height = QApplication::desktop()->availableGeometry().height();
    QPoint center = QApplication::desktop()->availableGeometry().center();
    w.setViewport(center,width,height);

    w.show();
    return a.exec();
}

// GtGuiApplication.cpp 
void QtGuiApplication1::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    // set the viewport
    painter.setViewport(centerOfViewport.x(),centerOfViewport.y(), widthOfViewport, heightOfViewport);

    static const QPointF points[4] = {
    QPointF(10.0, 10.0),
    QPointF(10.0, 80.0),
    QPointF(50.0, 80.0),
    QPointF(10.0, 10.0)
    };

    // set the window
    painter.setWindow(30,45,40,70);

    painter.drawPolyline(points, 4);
}

Однако все это не сработало.Прежде, чем я установил окно просмотра и окно:

enter image description here

И после того, как я сделал настройку:

enter image description here

1 Ответ

0 голосов
/ 28 сентября 2018

Я не понимаю, что вы указываете в строке, возможно, это выполняется в MFC, но правила не принимаются без их анализа, вы должны понимать их, и кажется, что вы хотите применить их, не понимая их правильно.

В соответствии с тем, что вы указали, вы хотите, чтобы многоугольник всегда центрировался внутри окна, а в вашем коде вы используете размер окна, который не имеет смысла, так как окно может находиться где угодно на экране.оттуда мы идем плохо.

Если вы хотите, чтобы центр многоугольника был центром окна, то вы должны рассчитать обе точки, учитывая в первом эталонном источнике верхний слой прямоугольника, граничащего с многоугольником,а во втором прямоугольник окна, если мы вычтем обе позиции, мы получим то, что художник должен переместить так, чтобы обе точки совпадали.

void QtGuiApplication1::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    static const QVector<QPointF> points = {
        QPointF(10.0, 10.0),
        QPointF(10.0, 80.0),
        QPointF(50.0, 80.0),
        QPointF(10.0, 10.0)
    };
    QPainterPath path;
    path.addPolygon(QPolygonF(points));
    QPointF center_path = path.boundingRect().center();
    painter.translate(rect().center()-center_path);
    painter.drawPath(path);
}

enter image description here

enter image description here

...