Сделать так, чтобы QDialog отображался на другом экране

Название говорит почти обо всем:

У меня есть два экрана, и каждый раз, когда я создаю QDialog, он появляется на том же экране, что и его родитель. Как я могу сделать так, чтобы он отображался на другом экране? Или мне следует использовать другой тип виджета верхнего уровня?

Код, который я использую для создания диалога:

QDialog my_dialog = new QDialog(this,
                                Qt::WindowMaximizeButtonHint |
                                Qt::WindowCloseButtonHint);

...

EDIT: я также пытался использовать QDesktopWidget, который дает мне объект QScreen, который ссылается на второй экран. Но тогда я не нахожу, как указать QDialog использовать этот QScreen (настройка его как родителя не работает).


person Daniel    schedule 19.03.2015    source источник


Ответы (2)


Плохо, что вы редактируете свой вопрос, не читая комментариев :(

// Your screen geometry:
QRect buildScreenGeometry()
{
  auto desktop = QApplication::desktop();
  QRect virtualRect;

  const auto n = desktop->screenCount();
  for ( auto i = 0; i < n; i++ )
    virtualRect |= desktop->screenGeometry(i);

  return virtualRect;
}

// Moving
auto dlg = new QDialog( someParent );
auto newPoint = QPoint( 2000, 0 ); // point on another screen
auto realPos = someParent->mapFromGlobal( newPoint );
dlg->move( realPos );

Это все.

ОБНОВЛЕНИЕ:

Вы должны понимать, что есть только ОДНА область экрана с ОБЩЕЙ системой координат, которая содержит ВСЕ экраны.

Например, у вас есть 2 монитора с разрешением 800х600. Первый (основной) монитор стоит слева, а второй справа. В этом случае система координат, доступная для вашего приложения, будет 1600x600. Итак, если ваш виджет имеет размер 100x100 в верхнем левом углу на первом мониторе и вы хотите переместить его на другой, вам следует вызвать move(900x100); // 900 == screen1.width() + dialog.pos().x(). Тогда ваш виджет будет иметь позицию 100x100 на втором мониторе.

Вам следует прочитать документацию Qt.

person Dmitry Sazonov    schedule 20.03.2015
comment
Спасибо за ответ. Это правильно. Несмотря на то, что первая строка не имеет смысла, я редактировал вопрос 16 часов назад, и ни один комментарий не старше этого. - person Daniel; 20.03.2015

Вы можете использовать move на своем QDialog, но имейте в виду, что move установит позицию QDialog относительно своего родителя.

Вы можете получить положение экрана главного окна и использовать его для установки положения QDialog. Просто знайте, что у вас не обязательно будет 2 экрана на компьютере конечного пользователя.

Для получения дополнительной информации о move см.: http://doc.qt.io/qt-5/application-windows.html#window-geometry

person Jonathan Mee    schedule 19.03.2015
comment
Функция move() позволяет позиционировать только в соответствии с позицией своего родителя. Я не могу использовать это, чтобы переместить QDialog на другой экран, это основная проблема. - person Daniel; 20.03.2015
comment
@Mondkin, ты ошибаешься. Вы можете использовать движение. Просто вызовите mapFromGlobal для расчета необходимых координат. Или вы можете использовать QWindow::setScreen. - person Dmitry Sazonov; 20.03.2015
comment
@Mondkin Yup SaZ имеет на это право. Его ответ - реализация перемещения, которая полностью работоспособна. Есть и другие методы, но все они сводятся к использованию move. - person Jonathan Mee; 20.03.2015