RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1605886
Accepted
AllRight
AllRight
Asked:2025-01-30 07:30:50 +0000 UTC2025-01-30 07:30:50 +0000 UTC 2025-01-30 07:30:50 +0000 UTC

无法覆盖 QMainWindow 和任何其他 PyQt6 应用程序之间的焦点切换事件

  • 772

有一个类QWidget不应该作为第二个窗口打开,因此我使用Qt.WindowType.Popup。
一切工作正常,直到您单击应用程序窗口。Event它说
在应用程序窗口外进行了点击,但是当将焦点转移到另一个应用程序或桌面时,我的小部件会关闭,这不是我想要的。所以我尝试重新定义event焦点变化,但
print("The focus is lost, but the window remains open.")根本不起作用。

class AddFriendWidget(QWidget):
    def __init__(self, main_window):
        super().__init__()
        self.main_window = main_window
        self.init_ui()

    def init_ui(self):
        # Layout and widgets
        self.setFixedSize(300, 150)
        add_friend_layout = QVBoxLayout(self)

        self.info_label = QLabel("Enter friend's username:")
        add_friend_layout.addWidget(self.info_label)

        self.friend_input = QLineEdit()
        self.friend_input.setPlaceholderText("Friend's username")
        add_friend_layout.addWidget(self.friend_input)

        self.add_button = QPushButton("Add Friend")
        self.add_button.clicked.connect(self.add_friend)
        add_friend_layout.addWidget(self.add_button)

        self.cancel_button = QPushButton("Cancel")
        self.cancel_button.clicked.connect(self.close)  # Закрываем виджет
        add_friend_layout.addWidget(self.cancel_button)

        self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.Popup)
        self.installEventFilter(self)

        return self

    def add_friend(self):
        """Handle adding friend logic here."""
        friend_name = self.friend_input.text().strip()
        if friend_name:
            print(f"Friend '{friend_name}' added.")
        else:
            self.info_label.setText("Please enter a valid username.")


    def eventFilter(self, source, event):
        if event.type() == QEvent.Type.MouseButtonPress:
            global_pos = event.globalPosition().toPoint()  # Получаем координаты клика в глобальном пространстве

            if not self.main_window.geometry().contains(global_pos):
                print("Clicked OUTSIDE the entire application!")
            elif not self.geometry().contains(global_pos):
                print("Clicked outside the widget, but inside the main window.")
            else:
                print("Clicked inside the widget!")

            print(self.isVisible())
            return True
        
        # Проверяем, является ли событие фокусировки QFocusEvent, прежде чем обращаться к `reason()`
        if event.type() == QEvent.Type.FocusOut and isinstance(event, QEvent.FocusOut):
            if event.reason() == Qt.FocusReason.ActiveWindowFocusReason:
                print("The focus is lost, but the window remains open.")
                event.ignore()  
                return True  

        return super().eventFilter(source, event)
python
  • 1 1 个回答
  • 40 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2025-02-01T05:41:48Z2025-02-01T05:41:48Z

    您没有提供最低限度可重复的示例。

    我不确定我是否理解正确,但我觉得你很满意

    • void QWidget:: mousePressEvent(QMouseEvent *event)

    和

    • void QApplication:: focusChanged (QWidget *old, QWidget *now)复制代码

    去完成计划的事情。

    将导入更改为 PyQt6 并尝试。

    import sys
    from PyQt5.Qt import *
    
    
    class AddFriendWidget(QFrame):                    # QWidget QFrame
        def __init__(self, i, main_window=None):
            super(AddFriendWidget, self).__init__(main_window)
            
            self.i = i + 1
            self.main_window = main_window
            self.setObjectName('friendwidget')
            self.init_ui()
            
            layout = QHBoxLayout(self)
            layout.setContentsMargins(10, 0, 10, 10)
            layout.addWidget(self.qgroupbox)
    
        def init_ui(self):
            self.qgroupbox = QGroupBox(f'Widget_{self.i}', self)    
     
            # Layout and widgets
            self.setFixedSize(300, 150)
            add_friend_layout = QVBoxLayout(self.qgroupbox)
    
            self.info_label = QLabel("Enter friend's username:")
            add_friend_layout.addWidget(self.info_label)
    
            self.friend_input = QLineEdit()
            self.friend_input.setPlaceholderText("Friend's username")
            add_friend_layout.addWidget(self.friend_input)
    
            self.add_button = QPushButton("Add Friend")
            self.add_button.clicked.connect(self.add_friend)
            add_friend_layout.addWidget(self.add_button)
    
            self.cancel_button = QPushButton("Cancel")
            self.cancel_button.clicked.connect(self.close)  #Закрываем виджет
            add_friend_layout.addWidget(self.cancel_button)
    
    #?      self.setWindowFlags(
    #?          Qt.WindowType.FramelessWindowHint | Qt.WindowType.Popup)
    #?      self.installEventFilter(self)
    #?      return self
    
    # +++
        def mousePressEvent(self, event):                             # +++
            #print(f"Clicked внутри виджета ->`Widget_{self.i}`")
            self.main_window.statusBar().showMessage(
                f"Clicked внутри виджета ->`Widget_{self.i}`")
    
        def add_friend(self):
            """ Handle adding friend logic here. """
    
            friend_name = self.friend_input.text().strip()
            if friend_name:
                self.info_label.setText(friend_name)
            else:
                self.info_label.setText("Please enter a valid username.")
           
            
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            
            self.i = 0
            
            self.scrollArea = QScrollArea(widgetResizable=True)                         # +++
            self.setCentralWidget(self.scrollArea)
            
            self.content_widget = QWidget()
            self.scrollArea.setWidget(self.content_widget)
    
            self.add_button_widget = QPushButton("Add Widget")
            self.add_button_widget.clicked.connect(self.add_widget)
    
            self.layout = QVBoxLayout(self.content_widget) 
            self.layout.addWidget(self.add_button_widget, 
                alignment=Qt.AlignBottom) 
    
            self.setFocus()
            app.focusChanged.connect(self.onFocusChanged)
            
            self.statusBar().showMessage("bla-bla bla")
            
        def add_widget(self):
            addFriendWidget = AddFriendWidget(self.i, self)
            self.layout.insertWidget(self.i, addFriendWidget)
            self.i += 1
            self.window().statusBar().showMessage(
                f"Создали виджет `Widget_{self.i}`!") 
            
        def mousePressEvent(self, event):
            #print(f"Нажал за пределы виджетов, но внутри главного окна.")
            self.statusBar().showMessage("Нажал за пределы виджетов, но внутри главного окна.")
            
        def onFocusChanged(self):
            if not self.isActiveWindow():
                #print(f'Щелкнул за пределы всего приложения!')
                self.statusBar().showMessage(
                    "Щелкнул за пределы всего приложения!")
            else:
                self.statusBar().showMessage(
                    "Окно в фокусе, делайте что-нибудь!")        
    
            
    QSS = '''
    #friendwidget {
        background-color: #8EDEB1;
    }
    QGroupBox {
        background-color: white;
        border: 2px solid #f00;
        border-radius: 10px;
        margin-top: 12px;
        font-size: 18px;
    }
    QGroupBox::title {
        subcontrol-origin: margin;
        subcontrol-position: top center;
        color: #f00;
    }
    '''
            
            
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        app.setStyleSheet(QSS)
        window = MainWindow()
        window.resize(320, 550)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
        window.show()
        sys.exit(app.exec())    
    


    在此处输入图片描述


    在此处输入图片描述


    在此处输入图片描述


    在此处输入图片描述

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5