У меня была такая же проблема при портировании с Win32 на Mac OS X, особенно с:
a) Кнопки: их высота (в пикселях) должна быть разной, чтобы выглядеть одинаково.
b) Метки: размер шрифта (в пунктах) должен быть разным, чтобы выглядеть одинаково.
Я пытался создать как можно более общее решение, следуя этим правилам:
Я выполнил все редактирование макета формы и виджета ТОЛЬКО в одной среде (Windows XP) и перенес источник в другую (OS X) только для компиляции и тестирования.
Я создал общую функцию OS-Dependend для изменения высоты кнопки и размера шрифта метки во время выполнения (см. Ниже), и я вызывал эту функцию из каждого настраиваемого конструктора диалогов, после 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);
}
}
}
}
}
}