Nano Hash - криптовалюты, майнинг, программирование

Как сделать верхний QWidget модальным?

Я разрабатываю приложение в PyQT5, в котором вверху находится объект QWidget. Это приложение должно иметь возможность работать в режиме «киоск», поэтому моя цель состоит в том, чтобы сделать это верхнее QWidget модальным и предотвратить фокусировку любого другого работающего приложения.

Скелет основного класса ниже. Обратите внимание, что я вызываю метод setWindowModality(), который теоретически устанавливает выбранное поведение окна:

class MyApp(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowModality(3)

Мой основной метод заключается в следующем:

app = QApplication(sys.argv)
MyApp()
sys.exit(app.exec_())

Согласно документации метода setWindowModality():

Qt.NonModal 0 Окно не является модальным и не блокирует ввод в другие окна.

Qt.WindowModal 1 Окно является модальным по отношению к иерархии одного окна и блокирует ввод в свое родительское окно, все родительские окна и все родственные окна родительского и родительского окон.

Qt.ApplicationModal 2 Окно является модальным для приложения и блокирует ввод во все окна.

Проблема в том, что окно вообще не модальное, я могу переключиться на другое приложение (скажем, веб-браузер), что я и хочу предотвратить. Я также пробовал 1, 2, 3 в качестве значений, и они дают такое же поведение.

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

Я пропустил что-то очевидное здесь? В случае, если проблема заключается в ограничении дизайна, есть ли способ имитировать модальное окно?

31.10.2016

Ответы:


1

Модальность относится только к текущему приложению. Если приложение имеет только одно открытое окно верхнего уровня, то нет никакой разницы между модальным окном и приложением. Эта модальность не влияет на другие приложения, поэтому вы не можете добиться с ее помощью того, чего хотите, нет простого флага «модальный рабочий стол».

Вы можете использовать Qt, чтобы сделать окно полноэкранным, но вы должны использовать другие средства, чтобы запретить пользователю доступ к рабочему столу или закрытие приложения (часто привязывается к сочетанию клавиш ALT-F4). Если ваша платформа Windows, то я не знаю, как это сделать, но я уверен, что способ есть. В X11 (обычно используется в Linux) самый простой способ сделать это — вообще не иметь рабочего стола, просто запустив приложение без рабочего стола. Посмотрите пакет nodm, чтобы узнать, как это сделать.

31.10.2016
  • Использование полноэкранного подхода — это способ, но это влечет за собой много дополнительной работы, поскольку блокируется не только комбинация ALT+F4, но и другие, такие как ALT+TAB, клавиша меню (между CTRL и ALT). Хотя и выполнимо, я думаю, что это принесет больше проблем, чем пользы. Однако я проверю пакет nodm. 31.10.2016
  • Действительно, но всеми этими ярлыками занимается менеджер рабочего стола. Нет диспетчера рабочего стола —> нет проблем (по крайней мере, в отношении этих ярлыков). 31.10.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..