QT windows dpi变化导致的界面异常处理

对高分屏不同缩放比例的自适应处理方法

//方法1:在main函数的最前面加上下面这句 5.6版本才开始有这个函数
#if (QT_VERSION > QT_VERSION_CHECK(5,6,0))
    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

//方法2:在可执行文件同目录下新建文件 qt.conf 填入下面内容
[Platforms]
WindowsArguments = dpiawareness=0

//方法3:在main函数最前面设置Qt内部的环境变量
qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1.5");

//方法4:新版本的Qt比如Qt5.14修正了对高分屏的处理支持不是整数的缩放
qputenv("QT_ENABLE_HIGHDPI_SCALING", "1");
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);

这几个的处理方式基本上都是按照等比放大来的。

QT里可以检测到DPI变化

QList<QScreen*> screens = QApplication::screens();
    if (screens.size() > 0) {
        QScreen* screen = screens[0];
        connect(screen, &QScreen::logicalDotsPerInchChanged, this, &CLASSNAME::OnLogicalDotsPerInchChanged);
        connect(screen, &QScreen::geometryChanged, this, &CLASSNAME::OnDeskTopResize);
    }

//geometryChanged 这个是分辨率变化
CLASSNAME::OnDeskTopResize(qrect)
{
}
//这个是dpi变化
void CLASSNAME::OnLogicalDotsPerInchChanged(qreal dpi)
{
    P_LOG_INFO("OnLogicalDotsPerInchChanged dpi:%f", dpi);

    emit Sig_dpi_change();
}

dpi变化之后的第一次的渲染窗口的尺寸是会变化的。

在paintevent里面按dpi变化了。

我采用在Sig_dpi_change信号后重置一下窗口(我的需求是各种位置不变,当然变化的也可以这里写)

void WuYun::OnDpiChange()
{
    //这里要设置回最初的尺寸。
    const QObjectList& child_list = children();
    for each (QObject* child in child_list)
    {
        QWidget* w = dynamic_cast<QWidget*>(child);
        if (w)
            w->repaint();
    }
}

最终采用的解决方案是:

双管齐下。

qt.conf里设置来解决不同dpi下位置大小不对的问题。

[Platforms]
WindowsArguments = dpiawareness=0
并且监控dpi变化重置界面,来解决中途变化的问题。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt是一个跨平台的图形用户界面(GUI)开发框架,它提供了丰富的工具和功能,使开发者能够快速创建漂亮、现代化的应用程序。 QtWindows平台上开发登录界面非常简单。首先,我们可以使用Qt的设计工具Qt Designer来创建界面Qt Designer提供了一组易于使用的视觉设计工具,通过拖放和布局方式,我们可以轻松地设计登录界面的各个组件,比如用户名输入框、密码输入框、登录按钮等。 然后,我们需要编写代码来处理用户与界面的交互行为。在Qt中,我们可以使用Qt Widgets模块来实现登录界面的逻辑。通过信号和槽机制,我们可以将用户的操作(比如点击登录按钮)与相应的处理函数连接起来,实现对用户输入的验证以及登录功能的实现。 在验证用户输入时,我们可以使用Qt提供的QValidator类来进行输入的合法性检查,比如确保用户名和密码不能为空、长度符合要求等。另外,还可以使用Qt的QMessageBox类来显示验证失败或登录错误的提示信息,让用户能够及时了解错误的原因。 最后,在用户登录成功后,我们可以通过Qt的窗口管理机制来切换到主界面或其他需要显示的界面Qt的多窗口管理非常灵活,我们可以通过创建新窗口、隐藏/显示窗口等方式来实现界面切换。 总之,使用Qt来开发Windows登录界面非常方便,除了提供了丰富的界面设计工具和功能,还提供了一套易于使用的API来处理用户交互和界面逻辑。无论是简单的登录界面还是复杂的应用程序,Qt都能够提供强大的支持。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值