我有一些在Windows上设计的QDialog子类,现在正在移植到Mac OS X.问题是Mac OS X上的默认字体看起来要大得多,所以对话框看起来非常狭窄
在Mac OS X上使对话框比在Windows上更好的最佳方法是什么? (大小必须在每个平台上保持固定,并且它们必须看起来是原生的。)
一个例子是Perforce的P4V中的对话框。
感谢。
答案 0 :(得分:3)
从Win32移植到Mac OS X时遇到了同样的问题,尤其是:
a)按钮:它们的高度(以像素为单位)必须不同才能看起来相同。
b)标签:字体大小(以磅为单位)必须不同才能看起来相同。
我尝试按照以下规则创建一个可能的通用解决方案:
我只在一个环境(Windows XP)中执行了所有表单和窗口小部件布局编辑,并将源代码转换为其他(OS X)仅用于编译和放大。测试
我创建了一个通用的OS-Dependend函数来在运行时修改Button Height和Label的font-size(参见下文),我在每个自定义对话框构造函数中调用了这个函数,在这样的setupUI()之后:
someDialog :: someDialog(QWidget * parent):QDialog(parent)
{
setupUi(本);
genAdjustWidgetAppearanceToOS(本);
// ...
}
我在genAdjustWidgetAppearanceToOS(this)函数中引入了一个例外列表, 并在其中输入我不想影响的所有控件的名称(没有什么是完美的)。
这是我的通用功能,检查它是否对您有任何帮助: (!记得至少修改“DoNotAffect”列表并附加你的标签/按钮名称)
// ======================================================
// Adjust specific Widget children according to O/S
// => Set Buttons height
// => Set labels font size
// ======================================================
void genAdjustWidgetAppearanceToOS(QWidget *rootWidget)
{
if (rootWidget == NULL)
return;
QObject *child = NULL;
QObjectList Containers;
QObject *container = NULL;
QStringList DoNotAffect;
// Make an exception list (Objects not to be affected)
DoNotAffect.append("aboutTitleLabel"); // about Dialog
DoNotAffect.append("aboutVersionLabel"); // about Dialog
DoNotAffect.append("aboutCopyrightLabel"); // about Dialog
DoNotAffect.append("aboutUrlLabel"); // about Dialog
DoNotAffect.append("aboutLicenseLabel"); // about Dialog
// Set sizes according to OS:
#ifdef Q_OS_MAC
int ButtonHeight = 32;
int LabelsFontSize = 12;
#else // Win XP/7
int ButtonHeight = 22;
int LabelsFontSize = 8;
#endif
// Append root to containers
Containers.append(rootWidget);
while (!Containers.isEmpty())
{
container = Containers.takeFirst();
if (container != NULL)
{
for (int ChIdx=0; ChIdx < container->children().size(); ChIdx++)
{
child = container->children()[ChIdx];
if (!child->isWidgetType() || DoNotAffect.contains(child->objectName()))
continue;
// Append containers to Stack for recursion
if (child->children().size() > 0)
Containers.append(child);
else
{
// Cast child object to button and label
// (if the object is not of the correct type, it will be NULL)
QPushButton *button = qobject_cast<QPushButton *>(child);
QLabel *label = qobject_cast<QLabel *>(child);
if (button != NULL)
{
button->setMinimumHeight(ButtonHeight); // Win
button->setMaximumHeight(ButtonHeight); // Win
button->setSizePolicy(QSizePolicy::Fixed,
button->sizePolicy().horizontalPolicy());
}
else if (label != NULL)
{
QFont aFont = label->font();
aFont.setPointSize(LabelsFontSize);
label->setFont(aFont);
}
}
}
}
}
}
答案 1 :(得分:0)
我过去曾做过两件事来处理类似的怪事(当你到达移植设备的时候,它会变得更糟):
1)使用基于原始的缩放字体:
QFont font = widget.font();
font.setSize(3 * font.size() / 2);
widget.setFont(font);
但这可能不适合你。
2)遗憾的是,使用ifdef来实现每个平台:
#ifdef Q_OS_MAC
// change font here
#endif
可以找到完整的操作系统定义列表here