如何将图形保持在主窗口的中心

Posted

技术标签:

【中文标题】如何将图形保持在主窗口的中心【英文标题】:How to keep the graphics in the center of main window 【发布时间】:2018-09-28 08:28:52 【问题描述】:

我正在学习 Qt5,我使用的是 Qt 5.9.1。现在我有一个问题:即使主窗口的大小发生变化,?

去年我在课堂上学习了MFC,老师告诉我们,为了让图形始终留在窗口中,我们应该做到以下几点:

    让视口的原点成为客户区的中心; 让视口的大小等于客户区的大小; 设窗口原点为图形外接矩形的中心; 设窗口大小为图形边框大小。

所以我在 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);

但是所有这些都不起作用。在我设置视口和窗口之前: 在我完成设置后:

【问题讨论】:

【参考方案1】:

我不明白你在该行中指出的内容,也许它在 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);

【讨论】:

谢谢!实际上,当我进行 GUI 编程时,我总是陷入其中。这对我来说似乎太复杂了。

以上是关于如何将图形保持在主窗口的中心的主要内容,如果未能解决你的问题,请参考以下文章

我如何将jframe对齐到netbeans中的窗口中心[关闭]

使用 Qt 将 linux 子窗口保持在父窗口之上

如何使用 python 3 tkinter/guizero 在主窗口中间启动第二个窗口?

c# 如何保持一个MDI子窗口永远最大化?

tkinter怎么使Toplevel保持在主窗口的上面

OPENGL如何在改变窗口大小时,使自己的图形不被拉伸保持自己的纵横比,把原理也解释下,不要只给代码