https://wiki.archlinux.org/index.php/HiDPI has lots of information.
I have a Thinkpad X1C and an external monitor, both with QHD resolution. What I ended up with is using xrandr scaling to increase the resolution of the external monitor (probably should have gotten a 4K instead...), and tweaking font sizes and Firefox's UI scaling until it looks okay on both screens. For QT apps I also had to set QT_AUTO_SCREEN_SCALE_FACTOR=0. Some proprietary apps are still too small though, so I tend not to use them ;-)
The xrandr scaling is applied through a script and not persistent, so I mapped it to a keyboard shortcut I can press when I reconnect the monitor.
My script looks like this:
xrandr \
--output eDP-1 --pos 0x0 --scale 0.9999x0.9999 \
--output DP-2 --pos 2560x0 --scale 1.25x1.25
The silly 0.9999x0.9999 scaling on the first screen is to work around a mouse flickering bug in the modesetting driver:
https://gitlab.freedesktop.org/xorg/xserver/issues/70