LINUX.ORG.RU

Почему не устанавливается ширина диалогового окна QInputDialog?

 qinputdialog, ,


0

1

Устанавливаю правило setMinimumWidth() для диалогового окна QInputDialog. Но оно не применяется:

  int dialogWidth=750;

  QInputDialog inputDialog;
  inputDialog.setMinimumWidth( dialogWidth );
  bool ok;
  QString refereceUrl=inputDialog.getText(editor,
                                          tr("Reference or URL"),
                                          tr("Reference or URL:"),
                                          QLineEdit::Normal,
                                          href,
                                          &ok);


Размер окна как был маленьким, так и остается. Почему?

★★★★★
Ответ на: комментарий от m0rph

dialogWidth - это на самом деле не просто значение. Я высчитываю ширину основного окна, беру от него 80-90% и хочу открыть с такой шириной диалог редактирования URL-а.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от ukr_unix_user

тебе нужен resize().

В какой момент этот resize вызывать? До использования getText - бесполезно, ибо неизвестно, что вызовится у QInputDialog - getText(), getInt(), getDouble(), getMultiLineText()... а после уже и не нужно.

ибо Minimum это просто возможный Minimum.

Ну и почему окно открывается шириной меньше, чем возможный минимум?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от ukr_unix_user

By default, this property contains a size with zero width and height.

Ну, так я же устанавливаю перед открытием окна значение:

inputDialog.setMinimumWidth( dialogWidth );

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от ukr_unix_user

If the widget is visible when it is being resized, it receives a resize event (resizeEvent()) immediately. If the widget is not currently visible, it is guaranteed to receive an event before it is shown.

Ну и как это поможет? Данный метод нельзя вызвать напрямую после установки setMinimumWidth():

inputDialog.resizeEvent();

/media/wd_640_part_2/opt/Qt_5_4_2/5.4/gcc/include/QtWidgets/qdialog.h:101: ошибка: 'virtual void QDialog::resizeEvent(QResizeEvent*)' is protected
     void resizeEvent(QResizeEvent *);
          ^

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от ukr_unix_user

просто вызови ресайз вместо сетминимум или попробуй репаинт после сетминимум

И какой установить ВЫСОТУ? Мне она нужна такая, какая получится. А вызвать resize без высоты нельзя:

void resize(int w, int h)
void resize(const QSize &)

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

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

ukr_unix_user ★★★★
()
Ответ на: комментарий от Xintrea

Передай в качестве аргумента высоты текущую высоту виджета и все. В чем проблема?

Noob_Linux ★★★★
()
Ответ на: комментарий от ukr_unix_user

inputDialog.setMinimumWidth(750);
inputDialog.adjustSize();
сделает то, что ты хочешь.

Нет, не работает. Окно все такого же размера.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

В исходниках Qt следующее:

QString QInputDialog::getText(QWidget *parent, const QString &title, const QString &label,
                              QLineEdit::EchoMode mode, const QString &text, bool *ok,
                              Qt::WindowFlags flags)
{
    QInputDialog dialog(parent, flags);
    dialog.setWindowTitle(title);
    dialog.setLabelText(label);
    dialog.setTextValue(text);
    dialog.setTextEchoMode(mode);

    int ret = dialog.exec();
    if (ok)
        *ok = !!ret;
    if (ret) {
        return dialog.textValue();
    } else {
        return QString();
    }
}

Функция статическая, все твои потуги она игнорирует. Если тебе так сильно нужно руками выставить размер, нужно самому создать экземпляр, что ты и сделал, но потом вручную выставить размеры, текст, и прочее; затем вызвать exec(), типа такого:

  int dialogWidth = 1350;
  
  QInputDialog inputDialog;
  
  inputDialog.setMinimumWidth(dialogWidth);
  inputDialog.resize(inputDialog.size());
  inputDialog.setWindowTitle("test");
  inputDialog.setLabelText("label");
  inputDialog.setTextValue("text");
  inputDialog.setTextEchoMode(QLineEdit::Normal);
  bool ok = !!inputDialog.exec();
  if (ok)
     return inputDialog.textValue();
  else
     return QString();

У меня работает.

false ★★★★★
()
Последнее исправление: false (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Вообще я выдрал это прямо из исходников, а так:

Двойное отрицание часто используют как оператор приведения к bool.

4.12 Boolean conversions [conv.bool]
An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true

false ★★★★★
()
Ответ на: комментарий от false

что так и должно быть?

любой QWidget отреагирует на adjustSize(). тут проблема скорее в том, что ТС надеетесь что окно которое рисует статический метод getText должно поменять размер после установки minimumSize для QInputDialog. вот так точно не будет.

ukr_unix_user ★★★★
()
Ответ на: комментарий от ukr_unix_user

Ну вот так бы и написал, а в примере, который дал ТС, adjustSize не прокатит

false ★★★★★
()
Последнее исправление: false (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.