You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySide2的QLabel右键唤出QMenu后保留选中文本蓝色背景

解决QLabel右键唤出菜单后选中文本背景变色的问题

问题根源在于你在rightMenuShow方法中重复设置了QLabel的样式表,额外添加了background-color: #f9f9f9;,这会让整个标签背景变为灰色,直接覆盖了文本选中时的蓝色背景样式,而且重复设置样式表属于冗余操作。

修复步骤:

  • 移除rightMenuShow方法中重新设置样式表的代码,保留初始化时的样式配置即可
  • 在QLabel的样式表中明确指定selection-background-color属性,确保选中文本的背景色不受其他操作干扰

修正后的完整代码:

import pyperclip
import sys
from PySide2.QtCore import Qt
from PySide2.QtGui import QCursor
from PySide2.QtWidgets import QLabel, QMenu, QAction, QHBoxLayout, QApplication, QWidget

class moreInfoLabel(QLabel):
    def __init__(self, *args, **kw):
        super().__init__(*args, **kw)
        self.setTextInteractionFlags(Qt.TextSelectableByMouse)
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.rightMenuShow)
        # 初始化样式表,明确指定选中文本的背景色
        self.setStyleSheet('''
        QMenu {
            border: 0px;
            font-size: 9pt;
            width:100px;
            background-color:white
        }

        QMenu::item { 
            width:160px;
            font-family: "Microsoft YaHei";
            border: 0px;
            min-height: 15px;
            max-height: 26px;
            padding:10px 15px 10px 15px;
            font-size: 9pt; 
        }
        
        QMenu::item:selected { 
            background-color: #f9f9f9;
        }
        QLabel{
            font-size:13px;
            font-family:微软雅黑;
        }
        /* 强制设置选中文本的背景色 */
        QLabel::selection {
            background-color: #1E90FF; /* 这里用你需要的蓝色,可自行调整 */
        }
        ''')

    def rightMenuShow(self, pos):
        menu = QMenu(self)
        copy_action = QAction('复制', menu)
        select_all_action = QAction('全选', menu)
        
        menu.addAction(copy_action)
        menu.addAction(select_all_action)
        menu.triggered.connect(self.menuSlot)
        menu.exec_(QCursor.pos())
    
    def menuSlot(self, act):
        if act.text() == '复制':
            pyperclip.copy(self.selectedText())
        elif act.text() == '全选':
            self.setSelection(0, len(self.text()))

class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.moreinfo = moreInfoLabel("YOUJIAN")
        self.layout = QHBoxLayout()
        self.layout.addWidget(self.moreinfo)
        self.setLayout(self.layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

额外说明:

  • 样式表中QLabel::selection是专门控制选中文本背景的属性,设置后无论是否唤出右键菜单,选中文本都会保持你指定的蓝色背景
  • 移除重复的样式表设置后,QLabel的原有状态不会被意外修改,右键菜单弹出后选中文本的样式也能保持一致

内容的提问来源于stack exchange,提问作者yongnisang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:55:15