Qt中setWhatsThis提示文本点击即消失无法选中复制该怎么解决?
问题原因
Qt 原生 QWhatsThis 弹窗的默认交互逻辑为:点击任意位置(包括弹窗内部区域)就会自动关闭,因此不支持直接选中、复制弹窗内的文本。
解决方案
方案1:通过事件过滤器修改默认关闭逻辑
全局安装事件过滤器,仅当用户点击弹窗外部时才关闭WhatsThis弹窗,保留弹窗内部的选中、交互权限:
from PyQt5.QtCore import QEvent, QObject from PyQt5.QtWidgets import QApplication, QWhatsThis class WhatsThisFilter(QObject): def eventFilter(self, obj, event): if event.type() == QEvent.MouseButtonPress and isinstance(obj, QWhatsThis): # 点击位置在弹窗内部时,拦截事件不触发关闭 if obj.rect().contains(event.pos()): return True return super().eventFilter(obj, event) # 在应用初始化阶段注册过滤器 if __name__ == "__main__": import sys app = QApplication(sys.argv) # 注册过滤器 filter_obj = WhatsThisFilter() app.installEventFilter(filter_obj) # 后续正常初始化你的窗口、调用setWhatsThis即可
方案2:替换为自定义可交互提示弹窗
如果需要更丰富的交互能力(比如支持富文本渲染、添加一键复制按钮),可以完全弃用原生QWhatsThis,自定义弹窗实现相同功能:
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QTextEdit, QPushButton def show_custom_tip(parent, tip_text): dialog = QDialog(parent) dialog.setWindowTitle("提示信息") dialog.resize(400, 300) layout = QVBoxLayout(dialog) # 只读QTextEdit原生支持文本选中、右键复制 text_area = QTextEdit() text_area.setReadOnly(True) text_area.setText(tip_text) layout.addWidget(text_area) close_btn = QPushButton("关闭") close_btn.clicked.connect(dialog.close) layout.addWidget(close_btn) dialog.exec_() # 原调用setWhatsThis的位置,改为绑定点击事件触发show_custom_tip方法即可
内容的提问来源于stack exchange,提问作者Flamingo
相关产品推荐
相关产品推荐

