QMessageBox从哪里获得其样式指南、字体大小..从…起



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

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

  • Q MessageBox::信息(…)
  • Q MessageBox::关键(…)
  • Q MessageBox::问题(…)
  • Q MessageBox::警告(…)

它们在大小、字体、字体大小、图标、背景(静态qmessagebox有两种背景颜色)等方面有所不同。

我唯一找到的是如何访问操作系统特定的消息框图标。

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

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

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

因此,我的问题是如何使从QDialog继承的自定义QMessageBox看起来像静态QMessageBox::。。。功能?

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

有点晚了,但今天我遇到了一个类似的问题,不是添加新元素,而是更改其中一些元素。我的解决方案:使用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"));

实际上,您可以在不创建自己的自定义类的情况下完成大部分工作。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;
    }
}

相关内容

  • 没有找到相关文章

最新更新