根据平台更改Qt对话框的大小

时间:2011-03-14 12:32:17

标签: qt macos qdialog

我有一些在Windows上设计的QDialog子类,现在正在移植到Mac OS X.问题是Mac OS X上的默认字体看起来要大得多,所以对话框看起来非常狭窄

在Mac OS X上使对话框比在Windows上更好的最佳方法是什么? (大小必须在每个平台上保持固定,并且它们必须看起来是原生的。)

一个例子是Perforce的P4V中的对话框。

感谢。

2 个答案:

答案 0 :(得分:3)

从Win32移植到Mac OS X时遇到了同样的问题,尤其是:

a)按钮:它们的高度(以像素为单位)必须不同才能看起来相同。

b)标签:字体大小(以磅为单位)必须不同才能看起来相同。

我尝试按照以下规则创建一个可能的通用解决方案:

  1. 我只在一个环境(Windows XP)中执行了所有表单和窗口小部件布局编辑,并将源代码转换为其他(OS X)仅用于编译和放大。测试

  2. 我创建了一个通用的OS-Dependend函数来在运行时修改Button Height和Label的font-size(参见下文),我在每个自定义对话框构造函数中调用了这个函数,在这样的setupUI()之后:

    someDialog :: someDialog(QWidget * parent):QDialog(parent)
    {
      setupUi(本);
      genAdjustWidgetAppearanceToOS(本);
      // ... }

  3. 我在genAdjustWidgetAppearanceToOS(this)函数中引入了一个例外列表, 并在其中输入我不想影响的所有控件的名称(没有什么是完美的)。

  4. 这是我的通用功能,检查它是否对您有任何帮助: (!记得至少修改“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