Qt 6中替代QDesktopWidget::resized信号的方案是什么?
Qt 6 替代 QDesktopWidget::resized 监听全局屏幕配置变化
Qt 6 移除了QDesktopWidget,原QDesktopWidget::resized信号可监听所有屏幕的分辨率调整、多屏布局变更,但替换组件QScreen仅支持监听单个屏幕的变化,QGuiApplication也没有直接对应的全局屏幕变更信号。你提到的screenAdded动态连接信号的思路是可行的,不过需要补充初始屏幕的信号连接,才能覆盖所有场景:
- 初始连接现有屏幕:程序启动时,遍历
QGuiApplication::screens()返回的所有屏幕,为每个屏幕连接geometryChanged信号到统一的处理函数。 - 动态监听新增屏幕:连接
QGuiApplication::screenAdded信号,每当有新屏幕添加时,立即为其绑定geometryChanged信号。 - 可选处理屏幕移除:如果需要关注屏幕消失的场景,可以连接
screenRemoved信号做清理(不过QScreen对象销毁时信号会自动断开,按需选择)。
示例代码
// 初始化时(如主窗口构造函数) void MainWindow::initScreenListeners() { // 连接所有已存在的屏幕信号 for (QScreen* screen : QGuiApplication::screens()) { connectScreenSignals(screen); } // 监听屏幕新增,动态连接信号 connect(QGuiApplication::instance(), &QGuiApplication::screenAdded, this, &MainWindow::connectScreenSignals); // 可选:监听屏幕移除,清理关联资源 connect(QGuiApplication::instance(), &QGuiApplication::screenRemoved, this, [this](QScreen* screen) { screen->disconnect(this); // 可选,对象销毁时自动断开,此处仅作显式清理示例 }); } // 统一的屏幕信号连接函数 void MainWindow::connectScreenSignals(QScreen* screen) { connect(screen, &QScreen::geometryChanged, this, &MainWindow::handleScreenChange); // 若需要监听屏幕刷新率、DPI等其他变化,可在此添加对应信号连接 } // 屏幕变化处理逻辑 void MainWindow::handleScreenChange(const QRect& newGeometry) { QScreen* screen = qobject_cast<QScreen*>(sender()); if (!screen) return; // 此处添加你的业务逻辑:比如调整窗口布局、适配分辨率等 qDebug() << "屏幕" << screen->name() << "配置变更,新几何尺寸:" << newGeometry; }
这种实现可以完整覆盖原QDesktopWidget::resized信号的所有场景:单屏分辨率调整、多屏布局变更、新增屏幕的后续变化。
内容的提问来源于stack exchange,提问作者Bri Bri
相关产品推荐
相关产品推荐

