Может ли QMessageBox :: about настроить размер по длине заголовка? - PullRequest
4 голосов
/ 07 апреля 2011

Я хотел создать простое диалоговое окно «О программе», но заметил, что QMessageBox::about не регулирует его размер в соответствии с длиной заголовка (который обычно длиннее из-за более крупного шрифта ... по крайней мере, в моей среде рабочего стола) Только для содержания. Есть ли способ убедиться, что диалог сделан достаточно большим, чтобы показать все заголовки? Конечно, я мог бы добавить пробел в aboutText, но я надеюсь на менее хакерское решение.

Пример:

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

В настоящее время приведенный выше код дает мне только "Some ..." в качестве строки заголовка. Я собрал программу в Eclipse на Ubuntu с Qt 4.7.

Ответы [ 2 ]

3 голосов
/ 25 ноября 2015

Используйте функцию "setStyleSheet ()" для QMessageBox.Вот пример.

background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #787878, stop: 0.5 #404040, stop: 0.6 #303030, stop: 0.8 #252525, stop: 1 #151515);
border: 2px solid #05b8cc;
border-radius: 8px;
color: white;
min-width: 300px;
min-height: 80px;

Это также повлияет на потомков "QMessageBox", таблицы стилей которых можно отменить, перебирая их.Чтобы получить доступ к детям, используйте «findChildren (QWidget)».

1 голос
/ 09 апреля 2011

Я считаю, что 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);
        }
    }
};

вот как это можно назвать:

QString titleText("Some title which is slightly longer");
QString aboutText("Short about text");
MyMessageBox::about(titleText, aboutText);

надеюсь, это поможет, с уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...