2015-07-13 2 views
4
#include <QtGui> 

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 

    // first 
    QMessageBox box(0); 
    box.setText("short text"); 
    box.setWindowTitle("looooooooooooooooong text"); 
    box.setMinimumSize(800, 0); 

    box.exec(); 


    // second 
    //QMessageBox::warning(0, "looooooooooooooooong text", "short text"); 

    return app.exec(); 
} 

enter image description hereQMessageBox не отображает всю главу

Оба подхода производят этот MessageBox, где название не отображается должным образом. Я попытался изменить размер виджета диалогового окна, это не поможет. Как заставить QMessageBox отображать весь заголовок?

В качестве обходного пути я могу добавить конечные пробелы в текст заголовка, но я думаю, что должно быть лучшее решение.

[email protected]:~/qt$ qmake --version 
QMake version 2.01a 
Using Qt version 4.8.6 in /usr/lib/x86_64-linux-gnu 
+0

Как вы попытались изменить размер диалогового виджета? – TheDarkKnight

+0

Вызов 'QWidget :: resize()' – Ashot

+3

Попробуйте [setMinimumSize] (http://doc.qt.io/qt-5/qwidget.html#minimumSize-prop) – TheDarkKnight

ответ

1

Я попытался создать QMessageBox с конструктором, который квартой помощи упомянутой в qmessagebox.cpp, но оно не работает для меня тоже. По какой-то причине QMessageBox размер корректировки по размеру названия окна не работает. Однако вы можете настроить размер MessageBox, создав свой собственный подкласс QMessageBox.

См. Пример ниже;

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); 
      } 
     } 
    }; 
+0

У меня появилась идея, но я не могу понять, почему вы явно устанавливаете текст, заголовок и значок в методе. Разве они уже не установлены в конструкторе? – Ashot

1

Оказывается, что QMessageBox, при запуске с Exec() проверяет длину текста тела и автоматически регулирует размер, игнорируя тот факт, что текст заголовка может быть больше. Хотя не идеал, вы можете изменить его, только потом с QTimer, как показано здесь:

QMessageBox* box = new QMessageBox; 
box->setText("short text"); 
box->setWindowTitle("looooooooooooooooong text"); 

QTimer* pTimer = new QTimer; 
pTimer->setSingleShot(true); 
QObject::connect(pTimer, &QTimer::timeout, [=](){ 
    box->setMinimumWidth(400); 
    pTimer->deleteLater(); 
}); 
pTimer->start(0); 
box->exec(); 

Поскольку это происходит после того, как окно сообщения запускаются, изменение размера видно.

Лучшим решением было бы просто создать свой собственный MessageBox, полученный из QDialog. В конце концов, класс QMessageBox - это просто удобный виджет.

+0

Я пробовал это решение. Он работал, если я изменяю pTimer-> start (30) вместо pTimer-> start (0). Но он также печатает это сообщение 'QCoreApplication :: postEvent: Неожиданный нулевой приемник ' Я изменил этот код. Я сделал функцию обратного вызова функцией членского слота пустого класса. – Ashot

+0

Я только что проверил, и я не предупреждаю, что вы упомянули, так что либо он специфичен для Linux, либо что-то еще вызывает его. Я подозреваю, что таймер 0 или 30 является проблемой синхронизации. Использование «0» означает, что событие отправляется сразу после обработки очереди событий.Если это происходит до запуска MessageBox, вы не увидите никакой разницы. В любом случае, похоже, что он работает для вас; O) – TheDarkKnight

1

exec() С и show() как переопределить минимальный размер на основе содержимого текста бокса, простое решение не использовать exec()и установить минимальный размер после того, как окно было показано на рисунке. В любом случае, вы никогда не должны использовать exec() в диалоговом окне.

Примечание: названия окон не переносятся. Ваш пользовательский интерфейс должен иметь смысл без названия окна. Например, в OS X заголовки окна окна сообщений являются невидимыми.

#include <QApplication> 
#include <QMessageBox> 
#include <QDebug> 

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 

    QMessageBox box; 
    box.setText("short text"); 
    box.setWindowTitle("looooooooooooooooong text"); 
    box.show(); 
    box.setMinimumSize(qMax(box.minimumWidth(), 800), box.minimumHeight()); 

    return app.exec(); 
} 
+0

Этот код не работает для меня. Он отображает старый почтовый ящик. – Ashot

+0

@Ashot Что вы подразумеваете под «старым» почтовым ящиком? –

+0

Я имею в виду, что ничего не меняет. – Ashot

Смежные вопросы