如何在 QTextEdit 中插入图像?

2024-02-16

所以我试图在 Qtexteditor 上插入图像,到目前为止我只能将 Qtexteditor 全部变成白色,我尝试了以下方法:

ACTIVATED_CSS = 'QTextEdit {image: url(einstein.jpg);}'

因此,我以随机顺序接收从 1 到 7 的一些数字(通过 TCP),当代码接收到它们时,相应的 Qtexteditor 会“亮起”绿色背景,但现在我想在亮起时更改为图像。

这是我的代码:

import sys
import threading
import asyncio
import time
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from TcpClient import TcpClient
from play_wav_files import PlaySoundThread


NORMAL_HIDDEN_CSS = 'QTextEdit {background-color: black; font: 30px; color: white;}'
ACTIVATED_CSS = 'QTextEdit {color: red; font: 25px; background-color: green;  font-weight: bold; margin-top: 10px; margin-bottom: 20px; margin-left: 30px; margin-right: 30px;}'
NORMAL_CSS = 'QTextEdit {color: white; font: 25px; background-color: grey;  font-weight: bold; margin-top: 10px; margin-bottom: 20px; margin-left: 30px; margin-right: 30px;}'
ACTIVATED_CSS_AR = 'QTextEdit {color: red; font: 25px; background-color: green;  font-weight: bold; margin-top: 20px; margin-bottom: 40px; margin-left: 50px; margin-right: 50px;}'
NORMAL_CSS_AR = 'QTextEdit {color: white; font: 25px; background-color: grey;  font-weight: bold; margin-top: 20px; margin-bottom: 40px; margin-left: 50px; margin-right: 50px;}'
TCP_CLIENT = TcpClient()
EW_CONSTANT = TCP_CLIENT.nepoch * TCP_CLIENT.nwords
ASYNC_LOOP = asyncio.get_event_loop()

#TENTAR COM IMAGENS CARAS ------------------

#ACTIVATED_CSS = 'QTextEdit {image: url(einstein.jpg);}'
#ACTIVATED_CSS_AR = 'QTextEdit {image: url(einstein.jpg);}'

class QtSideGui(QDialog):

    def __init__(self):
        QDialog.__init__(self)

        # buttons:
        self.conn_button = QPushButton('Recieve server instructions')
        self.clear_button = QPushButton('Clear status')
        self.insert_code_1 = QPushButton('Insert Code 1')
        self.insert_code_update_1 = QPushButton('insert update code 1')
        self.insert_code_2 = QPushButton('Insert Code 2')
        self.insert_code_update_2 = QPushButton('insert update code 2')
        self.insert_code_3 = QPushButton('Insert Code 3')
        self.insert_code_update_3 = QPushButton('insert update code 3')
        self.insert_code_4 = QPushButton('Insert Code 4')
        self.insert_code_update_4 = QPushButton('insert update code 4')
        self.insert_code_5 = QPushButton('Insert Code 5')
        self.insert_code_update_5 = QPushButton('insert update code 5')
        self.insert_code_6 = QPushButton('Insert Code 6')
        self.insert_code_update_6 = QPushButton('insert update code 6')
        self.insert_code_7 = QPushButton('Insert Code 7')
        self.insert_code_update_7 = QPushButton('insert update code 7')
        self.insert_code_1.setHidden(True)
        self.insert_code_update_1.setHidden(True)
        self.insert_code_2.setHidden(True)
        self.insert_code_update_2.setHidden(True)
        self.insert_code_3.setHidden(True)
        self.insert_code_update_3.setHidden(True)
        self.insert_code_4.setHidden(True)
        self.insert_code_update_4.setHidden(True)
        self.insert_code_5.setHidden(True)
        self.insert_code_update_5.setHidden(True)
        self.insert_code_6.setHidden(True)
        self.insert_code_update_6.setHidden(True)
        self.insert_code_7.setHidden(True)
        self.insert_code_update_7.setHidden(True)
        self.clear_button.setHidden(True)

        # Text Boxes:
        self._l_blank1 = QTextEdit('')
        self._l_blank1.setStyleSheet(NORMAL_HIDDEN_CSS)
        self._l_blank2 = QTextEdit('')
        self._l_blank2.setStyleSheet(NORMAL_HIDDEN_CSS)
        self._l_blank3 = QTextEdit('')
        self._l_blank3.setStyleSheet(NORMAL_HIDDEN_CSS)
        self._l_blank4 = QTextEdit('')
        self._l_blank4.setStyleSheet(NORMAL_HIDDEN_CSS)
        self._l_blank5 = QTextEdit('')
        self._l_blank5.setStyleSheet(NORMAL_HIDDEN_CSS)
        self._l_blank6 = QTextEdit('')
        self._l_blank6.setStyleSheet(NORMAL_HIDDEN_CSS)
        self._updadeQText = QTextEdit('-')
        self._updadeQText.setStyleSheet(NORMAL_HIDDEN_CSS)

        self._l_sim = QTextEdit()
        self._l_sim.setText('                             SIM')
        self._l_sim.setAlignment(Qt.AlignCenter)
        self._l_sim.setStyleSheet(NORMAL_CSS)

        self._l_nao = QTextEdit()
        self._l_nao.setText('                             NÃO')
        self._l_nao.setAlignment(Qt.AlignCenter)
        self._l_nao.setStyleSheet(NORMAL_CSS)

        self._l_fome = QTextEdit()
        self._l_fome.setText('                             FOME')
        self._l_fome.setAlignment(Qt.AlignCenter)
        self._l_fome.setStyleSheet(NORMAL_CSS)

        self._l_sede = QTextEdit()  
        self._l_sede.setText('                             SEDE')
        self._l_sede.setAlignment(Qt.AlignCenter)
        self._l_sede.setStyleSheet(NORMAL_CSS)

        self._l_urinar = QTextEdit() 
        self._l_urinar.setText('                             URINAR')
        self._l_urinar.setAlignment(Qt.AlignCenter)
        self._l_urinar.setStyleSheet(NORMAL_CSS)

        self._l_ar = QTextEdit()
        self._l_ar.setText('                            AR')
        self._l_ar.setAlignment(Qt.AlignCenter)
        self._l_ar.setStyleSheet(NORMAL_CSS_AR)

        self._l_posicao = QTextEdit()
        self._l_posicao.setText('                             POSIÇÃO')
        self._l_posicao.setAlignment(Qt.AlignCenter)
        self._l_posicao.setStyleSheet(NORMAL_CSS)


        # Layout:
        self._layoutGL = QGridLayout()
        self._layoutGL.addWidget(self._l_sim, 3, 1)
        self._layoutGL.addWidget(self._l_nao, 3, 4)
        self._layoutGL.addWidget(self._l_fome, 4, 2)
        self._layoutGL.addWidget(self._l_sede, 4, 3)
        self._layoutGL.addWidget(self._l_urinar, 2, 1)
        self._layoutGL.addWidget(self._l_posicao, 2, 4)
        self._layoutGL.addWidget(self._l_blank1, 2, 2)
        self._layoutGL.addWidget(self._l_blank2, 2, 3)
        self._layoutGL.addWidget(self._l_blank3, 3, 3)
        self._layoutGL.addWidget(self._l_blank4, 3, 2)
        self._layoutGL.addWidget(self._l_blank5, 4, 1)
        self._layoutGL.addWidget(self._l_blank6, 4, 4)

        self._layoutH = QHBoxLayout()
        self._layoutH.addWidget(self._l_blank2,35.5)
        self._layoutH.addWidget(self._l_ar,29)
        self._layoutH.addWidget(self._l_blank3,35.5)
        self._layoutV = QVBoxLayout()
        self._layoutV.addWidget(self._updadeQText)
        self._layoutV.addLayout(self._layoutH)
        self._layoutV.addLayout(self._layoutGL)
        self._layoutV.addWidget(self.conn_button)
        self._layoutV.addWidget(self.clear_button)

        # instruct QDialog to display:
        self.setWindowTitle("Code receiver")
        self.setLayout(self._layoutV)
        self.setFocus()

        # QT signal and slots connections
        self.conn_button.clicked.connect(self.open_tcp_connection)
        self.clear_button.clicked.connect(self.set_all_down)
        self.insert_code_1.clicked.connect(self.set_sim_highlight)
        self.insert_code_update_1.clicked.connect(self.set_update_text_sim)
        self.insert_code_2.clicked.connect(self.set_nao_highlight)
        self.insert_code_update_2.clicked.connect(self.set_update_text_nao)
        self.insert_code_3.clicked.connect(self.set_fome_highlight)
        self.insert_code_update_3.clicked.connect(self.set_update_text_fome)
        self.insert_code_4.clicked.connect(self.set_sede_highlight)
        self.insert_code_update_4.clicked.connect(self.set_update_text_sede)
        self.insert_code_5.clicked.connect(self.set_urinar_highlight)
        self.insert_code_update_5.clicked.connect(self.set_update_text_urinar)
        self.insert_code_6.clicked.connect(self.set_ar_highlight)
        self.insert_code_update_6.clicked.connect(self.set_update_text_ar)
        self.insert_code_7.clicked.connect(self.set_posicao_highlight)
        self.insert_code_update_7.clicked.connect(self.set_update_text_posicao)

    # Useful methods:
    @staticmethod
    def pick_up_text_and_update(text, text_code):
        return text + '  ' + text_code

    def open_tcp_connection(self):
        threading.Thread(target=self._asyncio_thread, args=(ASYNC_LOOP,)).start()

    def set_update_text_sim(self):
        self._updadeQText.setText(self.pick_up_text_and_update(self._updadeQText.toPlainText(), 'SIM'))

    def set_sim_highlight(self):
        self._l_sim.setStyleSheet(ACTIVATED_CSS)

    def set_update_text_nao(self):
        self._updadeQText.setText(self.pick_up_text_and_update(self._updadeQText.toPlainText(), 'NÃO'))

    def set_nao_highlight(self):
        self._l_nao.setStyleSheet(ACTIVATED_CSS)

    def set_update_text_fome(self):
        self._updadeQText.setText(self.pick_up_text_and_update(self._updadeQText.toPlainText(), 'FOME'))

    def set_fome_highlight(self):
        self._l_fome.setStyleSheet(ACTIVATED_CSS)

    def set_update_text_sede(self):
        self._updadeQText.setText(self.pick_up_text_and_update(self._updadeQText.toPlainText(), 'SEDE'))

    def set_sede_highlight(self):
        self._l_sede.setStyleSheet(ACTIVATED_CSS)

    def set_update_text_urinar(self):
        self._updadeQText.setText(self.pick_up_text_and_update(self._updadeQText.toPlainText(), 'URINAR'))

    def set_urinar_highlight(self):
        self._l_urinar.setStyleSheet(ACTIVATED_CSS)

    def set_update_text_ar(self):
        self._updadeQText.setText(self.pick_up_text_and_update(self._updadeQText.toPlainText(), 'AR'))

    def set_ar_highlight(self):
        self._l_ar.setStyleSheet(ACTIVATED_CSS_AR)

    def set_update_text_posicao(self):
        self._updadeQText.setText(self.pick_up_text_and_update(self._updadeQText.toPlainText(), 'POSIÇÃO'))

    def set_posicao_highlight(self):
        self._l_posicao.setStyleSheet(ACTIVATED_CSS)

    def set_all_down(self):
        self._l_sim.setStyleSheet(NORMAL_CSS)
        self._l_nao.setStyleSheet(NORMAL_CSS)
        self._l_fome.setStyleSheet(NORMAL_CSS)
        self._l_sede.setStyleSheet(NORMAL_CSS)
        self._l_urinar.setStyleSheet(NORMAL_CSS)
        self._l_ar.setStyleSheet(NORMAL_CSS_AR)
        self._l_posicao.setStyleSheet(NORMAL_CSS)

    def download_code(self):
        threading.Thread(target=self._asyncio_thread, args=(ASYNC_LOOP,)).start()

    async def get_one_code(self, tcp_client):
        serv_code = tcp_client.read_only_one_code_from_server()
        self.clear_button.click()
        t_sound = PlaySoundThread(thread_id=serv_code,
                                  name=serv_code,
                                  counter=int(serv_code),
                                  index_vec=int(serv_code))
        t_sound.start()
        self.decode_code(serv_code)
        if tcp_client.count - 1 in [0, EW_CONSTANT + 1, EW_CONSTANT * 2 + 2,
                                EW_CONSTANT * 3 + 3, EW_CONSTANT * 4 + 4,
                                EW_CONSTANT * 5 + 5, EW_CONSTANT * 6 + 6]:
            self.update_code_in_label(serv_code)
            await asyncio.sleep(1)
            self.clear_button.click()
        elif tcp_client.count - 1 in [EW_CONSTANT * 7 + 7,
                                EW_CONSTANT * 8 + 8, EW_CONSTANT * 9 + 9,
                                EW_CONSTANT * 10 + 10, EW_CONSTANT * 11 + 11,
                                EW_CONSTANT * 12 + 12, EW_CONSTANT * 13 + 13]:
            self.update_code_in_label(serv_code)
            await asyncio.sleep(1)
            self.clear_button.click()
        await asyncio.sleep(2)
        t_sound.join()
        return serv_code

    def check_aviability_func(self):
        print('aviability')

    def _asyncio_thread(self, async_loop):
        async_loop.run_until_complete(self.open_tcp_connections_and_enqueue())

    async def open_tcp_connections_and_enqueue(self):
        print("opening connection...")
        TCP_CLIENT.init_connection_with_server()
        print("connection ok!")
        tasks = [self.get_one_code(tcp_client=TCP_CLIENT) for num in range(999)]
        completed, pending = await asyncio.wait(tasks)
        results = [task.result() for task in completed]

    def decode_code(self, code):
        if code == 1:
            self.insert_code_1.click()
        elif code == 2:
            self.insert_code_2.click()
        elif code == 3:
            self.insert_code_3.click()
        elif code == 4:
            self.insert_code_4.click()
        elif code == 5:
            self.insert_code_5.click()
        elif code == 6:
            self.insert_code_6.click()
        elif code == 7:
            self.insert_code_7.click()
        else:
            print('unknown code received')
            self.set_all_down()
            print("error")
            exit(1)

    def update_code_in_label(self, code):
        self.clear_button.click()
        print('code inside update: {}'.format(code))
        if code == 1:
            self.insert_code_update_1.click()
        elif code == 2:
            self.insert_code_update_2.click()
        elif code == 3:
            self.insert_code_update_3.click()
        elif code == 4:
            self.insert_code_update_4.click()
        elif code == 5:
            self.insert_code_update_5.click()
        elif code == 6:
            self.insert_code_update_6.click()
        elif code == 7:
            self.insert_code_update_7.click()
        #time.sleep(1)
        self.clear_button.click()

    def closeEvent(self, event):
        close = QMessageBox.question(self,
                                               "QUIT",
                                               "Are you sure want to stop process?",
                                               QMessageBox.Yes | QMessageBox.No)
        if close == QMessageBox.Yes:
            event.accept()
            exit(-1)
        else:
            event.ignore



try:
    ap = QApplication(sys.argv)
    ap.setStyle('Fusion')
    ap.setStyleSheet('QApplication {background-color: black;}')
    dialog = QtSideGui()
    dialog.setStyleSheet('QtSideGui {background-color: black;}')
    dialog.show()
    sys.exit(ap.exec_())
except Exception as e:
    print(e)
    QMessageBox.information(ap, 'Information', 'An error has occurred.')


你知道我该怎么做吗?非常感谢


如果你想使用 Qt 样式表设置图像,那么你应该使用background-image: url(/path/of/image);,建议使用完整路径。如果你想改变图像,就必须强制它,为此你必须使用unpolish() and polish()方法,按顺序。

另一方面,如果您想根据小部件的状态更改 Qt 样式表,请使用 q 属性。

出于显而易见的原因,我不会使用您提供的代码,因此在下面的示例中,我生成随机数,使单个 QTextEdit 处于活动状态。另一方面,该项目的结构如下:

├── images
│   ├── image1.png
│   └── image2.png
└── main.py
import os
import random
import itertools
from PyQt5 import QtCore, QtGui, QtWidgets


class TextEdit(QtWidgets.QTextEdit):
    def isActive(self):
        if not hasattr(self, "_activated"):
            self._activated = False
        return self._activated

    def setActive(self, v):
        if self.isActive() == v:
            return
        self._activated = v
        self.style().unpolish(self)
        self.style().polish(self)

    active = QtCore.pyqtProperty(bool, fget=isActive, fset=setActive)


current_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)))
image_dir = os.path.abspath(os.path.join(current_dir, "images"))

QSS = """
TextEdit[active="false"]{
    background-image: url(%s);
    background-repeat: no-repeat;
    background-position: center;
}
TextEdit[active="true"]{
    background-image: url(%s);  
    background-repeat: no-repeat;
    background-position: center;
}
""" % (
    os.path.join(image_dir, "image1.png").replace(os.path.sep, '/'),
    os.path.join(image_dir, "image2.png").replace(os.path.sep, '/'),
)


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        lay = QtWidgets.QGridLayout(self)
        self.m_textedits = []

        for r, c in itertools.product((1, 2, 3, 4), (1, 2)):
            te = TextEdit()
            lay.addWidget(te, r, c)
            self.m_textedits.append(te)

        timer = QtCore.QTimer(self, timeout=self.generate, interval=500)
        timer.start()

    def generate(self):
        i = random.randint(0, len(self.m_textedits) - 1)
        for j, te in enumerate(self.m_textedits):
            te.setActive(i == j)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(QSS)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 QTextEdit 中插入图像? 的相关文章

  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • 以编程方式结束/退出粘合作业

    我正在使用 Glue 书签来处理数据 我的工作是每天安排的 但也可以 手动 启动 由于我使用书签 有时胶水作业可以在没有新数据要处理的情况下启动 然后读取的数据帧为空 在这种情况下 我想好好地结束我的工作 因为它没有什么关系 我试过 if
  • 为什么 pandas.DataFrame.update 会更改更新后的数据帧的数据类型?

    出于显而易见的原因 我想在更新后将列的数据类型保留为 int 有什么想法为什么这不能按预期工作吗 import pandas as pd df1 pd DataFrame a 1 b 2 c foo a 3 b 4 c baz df2 pd
  • 使用 Python 打开新窗口时,selenium window_handles 不正确

    我想使用 selenium 和 Python 在一个浏览器中打开多个选项卡 并通过多个选项卡同时抓取实时投注赔率 网站主页生成游戏列表 但是 除非您找到游戏元素并使用 click 该网站是 ajax 密集型 否则无法获取游戏链接 这会在同一
  • 在 Python 中倾斜数组

    我有一个 2D 数组 我将使用它保存为灰度图像scipy misc toimage 在此之前 我想将图像倾斜给定角度 像这样进行插值scipy ndimage interpolation rotate 上图只是为了说明倾斜过程 我知道我必须
  • ipython/jupyter 中的 tk 问题

    我正在尝试编写一个用于从 ipython jupyter 笔记本启动的 gui 但在笔记本中使用 tkinter 时遇到了麻烦 特别是在让 tk gui 窗口正常关闭方面 如何从 jupyter 制作 启动 tkinter gui 然后在不
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • 如何使用Peewee查询多个相似的数据库?

    我遇到了使用 Peewee 查询多个数据库的问题 我有 2 个现有的 mysql 数据库 让我们将它们命名为 A 和 B 结构相似 因为它是两个 Bugzilla 数据库 我使用 Pwiz 生成模型 modelsA py 和 modelsB
  • 使用 python boto3 管理 Route53 中具有多个 IP 的 A 记录

    我的route53中有一条A记录 后面有多个IP 例子 A record dummy xyz com 点IPs 1 1 1 1 2 2 2 2 和 3 3 3 3路由策略 Simple 我使用下面的代码来更新单个 IP 的记录 Change
  • 将具有多个时区的 pandas 列转换为单个时区

    Problem 我在 pandas DataFrame 中有一个列 其中包含带有时区的时间戳 此列中有两个不同的时区 我需要确保只有一个 这是该列末尾的输出 260003 2019 05 21 12 00 00 06 00 260004 2
  • 如何在solidpython中设置特殊变量$fa、$fs、$fn

    in 上一个线程 https stackoverflow com questions 54040390 how to save data in stl file after python solid processing显示了如何通过 So
  • 在解析器/子解析器的开头使用 argparse.REMAINDER

    我想实现一个 arg 解析器 它允许我将单元测试作为子命令之一运行 盲目地将参数传递给 unittest main 例如 foo py unittest args to pass to unittest main 以及其他子命令 foo p
  • Python:Factory Boy 生成对象创建时指定长度的列表

    我正在尝试使用 Factoryboy 在创建时指定长度的对象中创建一个列表 我可以创建列表 但由于提供的长度 大小的惰性性质 每次尝试创建具有指定长度的列表都会导致问题 这是我到目前为止所拥有的 class FooFactory facto
  • 获取列的 [0, x] 元素的最小值

    我需要计算一列 其中值是对其他列进行矢量化运算的结果 df new col df col1 min 0 df col2 然而 事实证明我不能像上面的语法一样使用 min 那么 获得 pandas 列的零和给定值之间的最小值的正确方法是什么
  • 如何仅在按下某个键时触发鼠标单击?在Python中

    我想制作一个程序 或者当我单击某个键时 鼠标会自动单击 只要我单击该键 如果我不单击该键 它就会停止 我不希望只在触摸按键一次时才发生点击 而是只要按住按键就发生点击 也可以像雷蛇突触鼠标一样按下鼠标左键触发点击 任何想法 EDIT 1 这
  • Django - 渲染到字符串无法加载 CSS

    我正在尝试使用 Django 1 8 render to string 通过管理命令将 html 转换为 pdf 而不是使用 View request 以下代码可以将模板转换为 pdf 但它无法将 CSS 加载到模板中 def html t
  • 如何单独捕获这些异常?

    我正在编写一个与 Quickbooks 交互的 Python 程序 连接到 Quickbooks 时 根据问题的不同 我可能会遇到以下两个常见异常之一 pywintypes com error 2147352567 Exception oc
  • 如何动态选择要在flask中使用的模板目录?

    默认情况下 Flask 使用存储在 template 目录中的模板文件 flaskapp application py templates hello html 有没有办法根据登录的用户动态选择模板目录 这就是我想要的目录结构 flaska
  • Paramiko ValueError“p 的长度必须恰好为 1024、2048 或 3072 位”

    我正在尝试使用 Python 脚本连接 SFTP 由于 p 错误 我无法连接 import paramiko client paramiko SSHClient client load system host keys client con
  • 如何使用多阶段构建减小 python (docker) 图像大小?

    我正在寻找一种使用 python 和 Dockerfile 创建多阶段构建的方法 例如 使用以下图像 第一张图片 安装所有编译时要求 并安装所有需要的 python 模块 第二张图片 将所有已编译 构建的包从第一个映像复制到第二个映像 而不

随机推荐