Qt hasfocus()的使用和Qt::Tool

本文详细解析了在开发过程中遇到的窗口焦点问题,并强调了`Qt::Tool`属性的重要性。通过设置此属性,避免了窗口抢占焦点导致的主窗口编辑功能失效问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hasfocus()是使用在轮询状态,也就是要到app.exec();所以要要写在相应的槽中等待信号setfocus()不用;

在做键盘时,当点击键盘时,会接收焦点。所以要用setFocusPolicy(Qt::NOFocus);

QT禁用最大化按钮 和 禁止调节窗口大小

setWindowFlags(windowFlags()& ~Qt::WindowMaximizeButtonHint);  

setFixedSize(this->width(), this->height()); 

今天检查了一天的代码,整来整去,原来是窗口少了这么一个属性 Qt::Tool

setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool );

这个属性很关键,当没有这个属性的时候,新的窗口会抢占焦点? 也不能这么说,后果是造成主窗口的编辑况无法编辑。找了很久才查出来原因,今后开发要注意了 !


以下是一个简单的实现,需要安装PyQt5QScintilla库: ```python import sys import os from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QKeySequence from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QFileDialog, QMessageBox, QSplitter, QTextEdit from PyQt5.Qsci import QsciScintilla, QsciLexerPython class Playground(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 设置窗口标题图标 self.setWindowTitle('Playground') self.setWindowIcon(QIcon('playground.png')) # 创建菜单栏 menubar = self.menuBar() # 文件菜单 fileMenu = menubar.addMenu('&文件') # 打开文件动作 openFileAction = QAction(QIcon('open.png'), '打开文件', self) openFileAction.setShortcut(QKeySequence.Open) openFileAction.triggered.connect(self.openFile) fileMenu.addAction(openFileAction) fileMenu.addSeparator() # 退出动作 exitAction = QAction(QIcon('exit.png'), '退出', self) exitAction.setShortcut(QKeySequence.Quit) exitAction.triggered.connect(self.close) fileMenu.addAction(exitAction) # 工具菜单 toolMenu = menubar.addMenu('&工具') # 运行文件动作 runFileAction = QAction(QIcon('run.png'), '运行文件', self) runFileAction.setShortcut('F5') runFileAction.triggered.connect(self.runFile) toolMenu.addAction(runFileAction) # 状态栏 self.statusBar().showMessage('就绪') # 创建操场二教画布 playgroundTitle = QTextEdit('操场') playgroundTitle.setReadOnly(True) self.playgroundCanvas = QsciScintilla() self.playgroundCanvas.setLexer(QsciLexerPython()) self.playgroundCanvas.setUtf8(True) erjiTitle = QTextEdit('二教') erjiTitle.setReadOnly(True) self.erjiCanvas = QsciScintilla() self.erjiCanvas.setLexer(QsciLexerPython()) self.erjiCanvas.setUtf8(True) # 创建分割器 splitter = QSplitter(Qt.Horizontal) splitter.addWidget(playgroundTitle) splitter.addWidget(self.playgroundCanvas) splitter.addWidget(erjiTitle) splitter.addWidget(self.erjiCanvas) self.setCentralWidget(splitter) # 设置窗口大小位置 self.setGeometry(300, 300, 800, 600) # 显示窗口 self.show() def openFile(self): # 打开文件对话框 fileName, _ = QFileDialog.getOpenFileName(self, "打开文件", "", "Python文件 (*.py)") if fileName: try: # 读取文件内容 with open(fileName, 'r', encoding='utf-8') as file: content = file.read() # 在当前活动窗口中显示文件内容 if self.playgroundCanvas.hasFocus(): self.playgroundCanvas.setText(content) elif self.erjiCanvas.hasFocus(): self.erjiCanvas.setText(content) except Exception as e: QMessageBox.critical(self, "错误", str(e)) def runFile(self): # 运行当前活动窗口中的python代码 if self.playgroundCanvas.hasFocus(): code = self.playgroundCanvas.text() exec(code) elif self.erjiCanvas.hasFocus(): code = self.erjiCanvas.text() exec(code) if __name__ == '__main__': app = QApplication(sys.argv) playground = Playground() sys.exit(app.exec_()) ``` 这个程序创建了一个包含两个画布的窗口,可以打开运行本地的Python文件。你需要将这个代码保存到一个文件中(例如`playground.py`),并在命令行中运行: ``` python playground.py ``` 注意,这个程序只是一个简单的示例,没有进行任何安全性检查,因此请不要在生产环境中使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值