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

Posted

技术标签:

【中文标题】根据平台更改 Qt 对话框的大小【英文标题】:Change the size of Qt dialogs depending on the platform 【发布时间】:2011-03-14 12:32:17 【问题描述】:

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

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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

我尝试创建一个尽可能通用的解决方案,遵循以下规则:

    我只在一个环境 (Windows XP) 中执行了所有表单和小部件布局编辑,并将源代码传输到其他环境 (OS X) 仅用于编译和测试。

    我创建了一个通用的 OS-Dependend 函数来在运行时修改按钮高度和标签的字体大小(见下文),并在 setupUI() 之后从每个自定义对话框构造函数中调用此函数,如下所示:

    someDialog::someDialog(QWidget *parent) : QDialog(parent) setupUi(这个); genAdjustWidgetAppearanceToOS(this); // ...

    我在 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);
                    
                
            
        
    

【讨论】:

【参考方案2】:

我过去做过两件事来处理这样的怪事(当你要移植到移动设备时,情况会变得更糟):

1) 在原版的基础上使用缩放字体:

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

但这可能不适合你。

2) 遗憾的是,使用 ifdefs 在每个平台上执行此操作:

#ifdef Q_OS_MAC
// change font here
#endif

完整的操作系统定义列表请见here

【讨论】:

嗨。感谢您的回复。我希望尽可能避免以任何方式更改字体,而是增加对话框本身的大小。我可以创建依赖于平台的 .ui 文件,但我有很多对话框,如果可能的话,我更喜欢更优雅的东西。谢谢。 你总是可以在对话框上调用 setSize() 来简单地增加它们的大小?

以上是关于根据平台更改 Qt 对话框的大小的主要内容,如果未能解决你的问题,请参考以下文章

qt 对话框扩展 缩放

怎样更改虚拟机硬盘大小

在 Qt Creator 中设计对话框时,如何理解所有小部件的大小和大小策略?

如何实现控件随对话框大小变化而自动调整大小和位置

Qt 销毁模态对话框

在预先存在的 x 平台项目中使用 Qt?