QMessageBox从哪里获得样式指南,字体大小......

时间:2014-09-29 11:01:28

标签: qt qmessagebox qstyle

我实现了一个继承自QDialog的自定义QMessageBox。 (使用qt 4.8.6)

问题是现在所有自定义消息框看起来都与QMessageBox静态函数完全不同:

  • QMessageBox :: information(...)
  • QMessageBox提示::临界(...)
  • QMessageBox :: question(...)
  • QMessageBox提示::警告(...)

它们的大小,字体,字体大小,图标,背景(静态qmessageboxs有两种背景颜色)等不同,......等。

我发现的唯一一件事就是如何访问特定于操作系统的消息框图标。

QStyle *style = QApplication::style();
QIcon tmpIcon = style->standardIcon(QStyle::SP_MessageBoxInformation, 0, this);//for QMessageBox::Information

字体或整个风格是否有相似之处。

我知道QMessagebox使用特定于操作系统的样式指针。但我找不到他们。 您可以查看来源here

所以我的问题是如何制作一个自定义QMessageBox,继承自QDialog看起来像静态QMessageBox :: ...函数?

(如果我可以访问QMessageBox对象,在这个静态函数调用中创建我可以读出所有样式和字体参数。但这是不可能的。)

2 个答案:

答案 0 :(得分:0)

实际上,你可以在不创建自己的自定义类的情况下完成大部分工作。 QMessageBox提供了一组对您有用的方法。这是它的例子:

QMessageBox msgBox;
msgBox.setText(text);
msgBox.setWindowTitle(title);
msgBox.setIcon(icon);

msgBox.setStandardButtons(standardButtons);
QList<QAbstractButton*> buttons = msgBox.buttons();
foreach(QAbstractButton* btn, buttons)
{
    QMessageBox::ButtonRole role = msgBox.buttonRole(btn);
    switch(role)
    {
        case QMessageBox::YesRole:
            btn->setShortcut(QKeySequence("y"));
        break;
        case QMessageBox::NoRole:
            btn->setShortcut(QKeySequence("n"));
        break;
    }
}

答案 1 :(得分:0)

有点晚了,但今天我遇到了类似的问题,与添加新元素无关,而是改变其中一些元素。我的解决方案:使用QProxyStyle(Qt 5+)。它基本上允许您重新实现基本样式的某些方面,而无需完全重新实现它。如果您使用QStyleFactory创建的样式,则特别有用。

这是覆盖QMessageBox::information上的默认图标的示例。

class MyProxyStyle : public QProxyStyle {
public:
  MyProxyStyle(const QString& name) :
    QProxyStyle(name) {}

  virtual QIcon standardIcon(StandardPixmap standardIcon,
                             const QStyleOption *option,
                             const QWidget *widget) const override {
    if (standardIcon == SP_MessageBoxInformation)
      return QIcon(":/my_mb_info.ico");
    return QProxyStyle::standardIcon(standardIcon, option, widget);
  }
};

然后将样式设置为您的应用:

qApp->setStyle(new MyProxyStyle("Fusion"));