Измените размер диалогов Qt в зависимости от платформы - PullRequest
2 голосов
/ 14 марта 2011

У меня есть несколько подклассов QDialog, которые были разработаны для Windows и теперь переносятся на Mac OS X. Проблема в том, что шрифт по умолчанию в Mac OS X выглядит намного больше, поэтому диалоги выглядят довольно тесными.

Какой лучший способ сделать диалоги больше в Mac OS X, чем в Windows?(Размер должен оставаться фиксированным на каждой платформе, и они должны выглядеть как родные.)

Пример - диалоговые окна в Perforce P4V.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

У меня была такая же проблема при портировании с Win32 на Mac OS X, особенно с:

a) Кнопки: их высота (в пикселях) должна быть разной, чтобы выглядеть одинаково.

b) Метки: размер шрифта (в пунктах) должен быть разным, чтобы выглядеть одинаково.

Я пытался создать как можно более общее решение, следуя этим правилам:

  1. Я выполнил все редактирование макета формы и виджета ТОЛЬКО в одной среде (Windows XP) и перенес источник в другую (OS X) только для компиляции и тестирования.

  2. Я создал общую функцию OS-Dependend для изменения высоты кнопки и размера шрифта метки во время выполнения (см. Ниже), и я вызывал эту функцию из каждого настраиваемого конструктора диалогов, после setupUI (), например так:

    someDialog :: someDialog (QWidget * parent): QDialog (parent)
    {
    setupUi (это);
    genAdjustWidgetAppearanceToOS (это);
    // ...
    }

  3. Я ввел список исключений в функцию 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);
                    }
                }
            }
        }
    }
}
0 голосов
/ 14 марта 2011

В прошлом я сделал две вещи, чтобы справиться с такими странностями (и когда вы подошли к моменту портирования на мобильные устройства, все стало намного хуже):

1) использовать масштабированные шрифты на основена оригинале:

QFont font = widget.font();
font.setSize(3 * font.size() / 2);
widget.setFont(font);

Но это, вероятно, не совсем для вас.

2) используйте, к сожалению, ifdefs, чтобы сделать это для каждой платформы:

#ifdef Q_OS_MAC
// change font here
#endif

Полный список определений ОС можно найти здесь

...