7
#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();
}

ここに画像の説明を入力

どちらの方法でも、タイトルが正しく表示されないこのメッセージ ボックスが生成されます。ダイアログウィジェットのサイズを変更しようとしましたが、役に立ちません。QMessageBox にタイトル全体を表示させるにはどうすればよいですか?

回避策として、タイトル テキストに末尾のスペースを追加できますが、もっと良い解決策があるはずです。

aminasya@aminasya-desktop:~/qt$ qmake --version
QMake version 2.01a
Using Qt version 4.8.6 in /usr/lib/x86_64-linux-gnu
4

4 に答える 4

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();

これはメッセージ ボックスが起動された後に発生するため、サイズの変更が表示されます。

より良い解決策は、QDialog から派生した独自の MessageBox を作成することです。結局のところ、QMessageBox クラスは単なる便利なウィジェットです。

于 2015-07-13T10:11:16.913 に答える
1

QMessageBoxqt help が言及したコンストラクターで作成しようとしまし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);
            }
        }
    };
于 2015-07-13T10:01:12.523 に答える
1

exec()およびshow()どちらもボックスのテキストの内容に基づいて最小サイズをオーバーライドするため、単純な解決策は、使用せず、exec() ボックスが表示された後に最小サイズを設定することです。exec()いずれにせよ、とにかくダイアログで使用しないでください。

注: ウィンドウ タイトルは移植できません。UI は、ウィンドウ タイトルがなくても意味のあるものでなければなりません。たとえば、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();
}
于 2015-07-13T16:39:29.713 に答える