我实现了一个从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;
}
}