【发布时间】:2018-03-08 07:01:21
【问题描述】:
有功能
QApplication::desktop()->screenCount();
QApplication::desktop()->screenGeometry();
我发现我的系统上有多少屏幕以及它们位于哪个屏幕坐标上。现在我想知道 QWidget 位于哪个屏幕上。我怎样才能做到这一点?我是否必须根据屏幕坐标检查 QWidget 的坐标,还是有更优雅的方法可以直接返回屏幕编号?
【问题讨论】:
有功能
QApplication::desktop()->screenCount();
QApplication::desktop()->screenGeometry();
我发现我的系统上有多少屏幕以及它们位于哪个屏幕坐标上。现在我想知道 QWidget 位于哪个屏幕上。我怎样才能做到这一点?我是否必须根据屏幕坐标检查 QWidget 的坐标,还是有更优雅的方法可以直接返回屏幕编号?
【问题讨论】:
QDesktopWidget 在较新的 Qt 版本中已弃用(5.11 and above、not deprecated in 5.10)。
从 Qt 5.10 开始,QGuiApplication::screenAt(QPoint) 可以替代 screenNumber(QPoint)。
似乎screenNumber(QWidget*) 没有直接替代品。但是,通过QScreen指针获取有关widget所在屏幕的信息是possible:
QScreen *screen = widget->window()->windowHandle()->screen();
qDebug() << screen->geometry()
<< screen->availableGeometry();
【讨论】:
我认为你应该寻找的功能是这个
int QDesktopWidget::screenNumber(const QPoint &point) const
这是一个重载函数。 返回包含该点的屏幕的索引,或距离该点最近的屏幕。
由于我没有多屏,你可以自己检查,QWidget::pos()函数提供了QPoint
编辑: 正如 cmets 中的 scopchanov 所建议的,您也可以使用
QDesktopWidget::screenNumber(const QWidget *widget = Q_NULLPTR)
【讨论】:
除了 Sillicomancers 的回答,我用下面的代码替换了被贬低的QDesktopWidget::availableGeometry(const QWidget *widget)
QScreen* pScreen = QGuiApplication::screenAt(widget->mapToGlobal({widget->width()/2,0}));
QRect availableScreenSize = pScreen->availableGeometry();
使用widget顶部中间所在的屏幕。
【讨论】:
QWidget::screen() 在 Qt5.14 中引入。
【讨论】: