我想控制Qt 5.2.1 QML/C++应用程序中所有Text元素的pointSize-to-pixel缩放.
我有一个QML单例组件,具有目标显示属性,如宽度,高度和点间距,可计算常见尺寸的适当像素大小,例如触摸屏按钮的建议大小(以像素为单位).这适用于我编写的控件,但Text元素有一个非常好的font.pointSize,如果我可以设置用于文本缩放的逻辑DPI,我想使用它.
我使用它来模拟具有非常不同的屏幕DPI的目标设备,同时在我的96 DPI开发屏幕上进行调试.例如,我想运行我的应用程序,其目标是1280x720 133DPI显示器,并具有如下元素:
Text { font.pointSize: 72; text: “Xy” }
Run Code Online (Sandbox Code Playgroud)
显示133像素高,而不是我得到的96像素高文本,因为操作系统告诉Qt我连接了96 DPI显示器.我想覆盖我的应用程序的逻辑DPI缩放.
我可以通过QGuiApplication QScreen列表看到logicalDotsPerInchX.有大量关于如何获得逻辑DPI的文档.但我找不到有关如何更改它的任何信息.
如何更改Qt应用程序的逻辑DPI?
我想将 C++ 类的方法绑定到 QML 组件属性,并在依赖属性更改时重新评估它。以下 QML 组件执行我想要的操作:
// Converter.qml:
import QtQuick 2.0
QtObject {
property double rate: 1
function exchange(amount) { return amount * rate }
}
Run Code Online (Sandbox Code Playgroud)
如果我将exchange函数的结果分配给这样的属性,
Text { text: converter.exchange(100) }
Run Code Online (Sandbox Code Playgroud)
Text 元素会在rate更改时自动更新。这适用于 QML 组件,但我不知道如何使用 C++ 类来实现。
我想在 C++ 中实现一个功能等效的类:
#include <QObject>
class Convert : public QObject
{
Q_OBJECT
Q_PROPERTY(double rate READ rate WRITE setRate NOTIFY rateChanged)
public:
explicit Convert(QObject *parent = 0)
: QObject(parent), m_rate(1.0)
{ }
signals:
void rateChanged();
public slots:
double …Run Code Online (Sandbox Code Playgroud) 我可以发出带有Q_GADGET标记的结构信号,从C++到QML.
是否有可能将这样的结构从QML发送到C++插槽?我的代码在第一步失败:在QML中创建实例.
这段代码在第一行失败了......
var bs = new BatteryState()
bs.percentRemaining = 1.0
bs.chargeDate = new Date()
DataProvider.setBatteryState(bs)
Run Code Online (Sandbox Code Playgroud)
......有错误:
qrc:///main.qml:34: ReferenceError: BatteryState is not defined
Run Code Online (Sandbox Code Playgroud)
我可以从C++向QML发出一个BatteryStatus结构,但是我想将一个参数作为单个参数发送回一个插槽.
这是BatteryState.h和BatteryState.cpp:
// BatteryState.h
#pragma once
#include <QDate>
#include <QMetaType>
struct BatteryState
{
Q_GADGET
Q_PROPERTY(float percentRemaining MEMBER percentRemaining)
Q_PROPERTY(QDate date MEMBER date)
public:
explicit BatteryState();
BatteryState(const BatteryState& other);
virtual ~BatteryState();
BatteryState& operator=(const BatteryState& other);
bool operator!=(const BatteryState& other) const;
bool operator==(const BatteryState& other) const;
float percentRemaining;
QDate date;
};
Q_DECLARE_METATYPE(BatteryState)
// BatteryState.cpp
#include "BatteryState.h"
BatteryState::BatteryState()
: percentRemaining(), …Run Code Online (Sandbox Code Playgroud)