Qt实现多屏幕多分辨率自适应

运行条件

  • 两个屏幕,分辨率不同。
  • Qt软件

问题提出

前段时间写了一个软件,窗口内有自绘内容。
自绘内容里面用的长度单位都是像素。可想而知,在开发者的电脑屏幕上大小都是符合要求的。到这一步都没问题。
软件开发完成后发给客户,客户在他的电脑上运行,也没问题,毕竟分辨率差不多。
偶然一次使用配有高分辨率显示器电脑运行软件,在4k屏下,软件出现了以下问题:

  • 整体尺寸和某些自绘内容(线条形状)变得很小,原因是屏幕分辨率升高了,像素更密集,相同个数的像素长度看起来更短,这个比较好理解。
  • 除了某些自绘的内容外,比如文字,却没有变小。这是因为在绘制文本的时候,字体设置大小使用了setPointSize,使得文本绘制在任何显示器上都具有相同的大小。
  • 最终的显示结果是,文字看起来很大,图形变得很小。

解决方法

实现多屏幕分辨率自适应

这里分两种情况讨论。

  1. 只使用一块屏幕
    这种情况下,只需要做以下工作:
  • 绘制图形时,以毫米为单位绘制。
  • 获取屏幕分辨率,添加长度->像素转换函数,将每个长度都转换成像素长度再传递给绘制函数。
    这样就可以实现不同分辨率下自绘内容自适应。
  1. 使用多个分辨率不同屏幕
    这种情况下,涉及到窗口拖拽的问题。
    当软件窗口从一个窗口拖拽到另外一个窗口时,需要重新排版。
    需要做以下工作:
  • 设计窗口分辨率改变通知信号
    在Qt中没有找到相关的通知机制,我们可以在paint函数中检测窗口的当前屏幕是否改变,如果发生改变,则发出一个信号。下面是一段实现代码,用于判断主屏幕是否改变:
bool Global::checkIfScreenChanged()
{
    static int screen_number = -1;
 
    bool changed = false;
    QWidget *w = mainWindow();
    QDesktopWidget *dk = QApplication::desktop();
    int new_screen_number = dk->screenNumber(w);
    if (screen_number != new_screen_number)
    {
        screen_number = new_screen_number;
        changed = true;
 
        // 发出通知
        emit sigScreenChanged(screen_number);
    }
 
    return changed;
}
  • 重新布局和绘制
    接收到窗口屏幕改变消息后,进行重新布局、绘制。

实现效果

达到了预期效果。

结语

Windows上的软件,比如office、WPS都对多分辨率多屏幕进行了处理,可以将上述任意软件打开后从一个窗口拖动到另外一个窗口,在跨越屏幕的瞬间,软件会进行重新布局。和我们使用本文方法实现的效果相同。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值