我实现了一个继承自QDialog的自定义QMessageBox。 (使用qt 4.8.6)
问题是现在所有自定义消息框看起来都与QMessageBox静态函数完全不同:
它们的大小,字体,字体大小,图标,背景(静态qmessageboxs有两种背景颜色)等不同,......等。
我发现的唯一一件事就是如何访问特定于操作系统的消息框图标。
QStyle *style = QApplication::style();
QIcon tmpIcon = style->standardIcon(QStyle::SP_MessageBoxInformation, 0, this);//for QMessageBox::Information
字体或整个风格是否有相似之处。
我知道QMessagebox使用特定于操作系统的样式指针。但我找不到他们。 您可以查看来源here。
所以我的问题是如何制作一个自定义QMessageBox,继承自QDialog看起来像静态QMessageBox :: ...函数?
(如果我可以访问QMessageBox对象,在这个静态函数调用中创建我可以读出所有样式和字体参数。但这是不可能的。)
答案 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"));