QMessageBox :: about可以将大小调整为标题长度吗?

fno*_*kke 5 qt qt4

我想创建一个简单的“关于”对话框,但是注意到QMessageBox::about并没有将其大小调整为标题的长度(由于字体较大而通常更长,至少在我的桌面环境中这样),仅针对内容。有没有办法确保对话框足够大以显示所有标题?我当然可以在aboutText上添加空格,但是我希望找到一种更简洁的解决方案。

例:

QString titleText("Some title which is slightly longer");
QString aboutText("Short about text");
QMessageBox::about(this,titleText,aboutText);
Run Code Online (Sandbox Code Playgroud)

目前,上面的代码仅给我提供“ Some ...”作为标题字符串。我已经在Qt 4.7的Ubuntu上的Eclipse中构建了该程序。

ser*_*nko 1

我相信确实QMessageBox会调整大小以适合窗口标题,但由于某种原因它也无法在我的系统上正常工作,不确定这是错误还是功能,这是在 qmessagabox.cpp 方法中完成的 QMessageBoxPrivate::updateSize()。

我注意到的另一件事是,您正在使用类的实例QMessageBox来调用about()方法,该方法是静态的,您可以仅使用类名来执行它:QMessageBox::about(..)。

您可以调整窗口大小的方法是创建您自己的子类QMessageBox并在 showEvent 方法中调整窗口的最小宽度,有关详细信息,请参阅下面的示例:

class MyMessageBox : public QMessageBox
{
public:
    explicit MyMessageBox(QWidget *parent = 0) : QMessageBox(parent) { }
    MyMessageBox(const QString &title, const QString &text, Icon icon,
                 int button0, int button1, int button2,
                 QWidget *parent = 0,
                 Qt::WindowFlags f = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint) :
        QMessageBox(title, text, icon, button0, button1, button2, parent, f) { }


    static void about(QString title, QString text)
    {
        MyMessageBox aboutBox(title, text, QMessageBox::Information, 0, 0, 0, NULL);

        aboutBox.setText(title);
        aboutBox.setText(text);
        QIcon icon = aboutBox.windowIcon();
        QSize size = icon.actualSize(QSize(64, 64));
        aboutBox.setIconPixmap(icon.pixmap(size));

        aboutBox.exec();
    }

    void showEvent(QShowEvent *event)
    {
        QMessageBox::showEvent(event);
        QWidget *textField = findChild<QWidget *>("qt_msgbox_label");
        if (textField != NULL)
        {
            // getting what ever my system has set for the window title font
            QFont font = QFont("Ubuntu Bold", 11);
            // you might want to make it more generic by detecting the actuall font
            // or using smth like this:
            //QFont font = QApplication::font("QWorkspaceTitleBar");

            QFontMetrics fm(font);
            int width = qMax(fm.width(windowTitle()) + 50, textField->minimumWidth());
            textField->setMinimumWidth(width);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

您可以这样称呼它:

QString titleText("Some title which is slightly longer");
QString aboutText("Short about text");
MyMessageBox::about(titleText, aboutText);
Run Code Online (Sandbox Code Playgroud)

希望这有帮助,问候