- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试制作一个更完整的示例 semi-transparent highlights使用列表:
(1) 聚合 R、G、B、A 和高光计数(五个列表)
(2)平均R、G、B、A(四个列表)
平均值列表中的值被指定为背景颜色。聚合列表用于通过添加和减去突出显示颜色来计算平均值。每个列表的元素数量与文本小部件中的字符数量相同。
我使用 pandas 数据框将突出显示存储在内存中,因为最终可能有大量的突出显示需要以各种方式处理以及其他数据。将鼠标放在某个字符上会打印出其位置、高光数量和 RGBA 值。不过,有时会出现一个问题——就好像画笔从一个高光位置移动到另一个位置时被拖动一秒钟。查看文本“PySide.QtCore”末尾的“e”上的青绿色。我认为问题在于我如何使用光标的设置和移动位置 - 但我不确定。添加每个突出显示后是否需要重置光标的位置?我是否没有正确选择单个字符?
import sys
import pandas as pd
import sqlite3
from PySide.QtCore import *
from PySide.QtGui import *
def connect_database(db_file):
try:
conn = sqlite3.connect(db_file)
return conn
except Error as e:
print(e)
return None
def create_data(connection): # database connection
c = connection.cursor() # database cursor
c.execute("CREATE TABLE sections(id INTEGER PRIMARY KEY, start INTEGER, end INTEGER, r INTEGER, g INTEGER, b INTEGER, a INTEGER)")
c.execute("INSERT INTO sections VALUES(1,0,20,100,200,100,100)")
c.execute("INSERT INTO sections VALUES(2,15,20,200,100,100,50)")
c.execute("INSERT INTO sections VALUES(3,18,30,100,100,200,100)")
c.execute("INSERT INTO sections VALUES(4,50,60,100,200,200,150)")
db.commit()
return c.lastrowid
class QTextEdit2(QTextEdit):
def __init__(self, parent=None):
super().__init__(parent)
self.setMouseTracking(True)
self.cursor = self.textCursor()
self.length = len(self.toPlainText())
self.bg_red = [0 for n in range(self.length)] # stores aggregate values of all highlights (not averages)
self.bg_green = [0 for n in range(self.length)]
self.bg_blue = [0 for n in range(self.length)]
self.bg_alpha = [0 for n in range(self.length)]
self.bg_count = [0 for n in range(self.length)] # number of highlights. if this is 0 then don't display
# stored r,g,b just display white. in this example
# only highlights are written. everything else stays
# default
self.display_red = [0 for n in range(self.length)] # set to the value to display (average of highlights)
self.display_green = [0 for n in range(self.length)]
self.display_blue = [0 for n in range(self.length)]
self.display_alpha = [0 for n in range(self.length)]
self.sections = self.load_sections()
self.color_sections()
def mouseMoveEvent(self, event):
point = QPoint()
x = event.x()
y = event.y()
point.setX(x)
point.setY(y)
n = self.cursorForPosition(point).position()
print("%d: Section Count: %d RGBA: %d %d %d %d" % (n, self.bg_count[n],self.display_red[n], self.display_green[n],self.display_blue[n], self.display_alpha[n]))
super().mouseMoveEvent(event)
def load_sections(self):
c = sqlite3.connect("qda_test_01.sqlite")
df = pd.read_sql_query("SELECT * FROM sections", c)
return df
def blend_colors(self, start, end, r, g, b, a):
for n in range(start,end):
self.bg_red[n] = self.bg_red[n]+r
self.bg_green[n] = self.bg_green[n]+g
self.bg_blue[n] = self.bg_blue[n]+b
self.bg_alpha[n] = self.bg_alpha[n]+a
self.bg_count[n] = self.bg_count[n]+1
self.display_red[n] = self.bg_red[n]/self.bg_count[n]
self.display_green[n] = self.bg_green[n] / self.bg_count[n]
self.display_blue[n] = self.bg_blue[n] / self.bg_count[n]
self.display_alpha[n] = self.bg_alpha[n] / self.bg_count[n]
if self.display_red[n] > 255: # just in case RGBA data is weird...
self.display_red[n] = 255
if self.display_green[n] > 255:
self.display_green[n] = 255
if self.display_blue[n] > 255:
self.display_blue[n] = 255
if self.display_alpha[n] > 255:
self.display_alpha[n] = 255
if self.display_red[n] < 0:
self.display_red[n] = 0
if self.display_green[n] < 0:
self.display_green[n] = 0
if self.display_blue[n] < 0:
self.display_blue[n] = 0
if self.display_alpha[n] < 0:
self.display_alpha[n] = 0
print("LOCATION: %d | SECTION: r:%d g:%g b:%d a:%d | DISPLAY: r:%d g:%g b:%d a:%d" % (n,self.bg_red[n],self.bg_green[n],self.bg_blue[n],self.bg_alpha[n],self.display_red[n],self.display_green[n],self.display_blue[n],self.display_alpha[n]))
color = QColor(self.display_red[n], self.display_green[n], self.display_blue[n])
color.setAlpha(self.display_alpha[n])
cursor = self.textCursor()
cursor.setPosition(n)
cursor.movePosition(QTextCursor.NextCharacter, QTextCursor.KeepAnchor, 1)
charfmt = cursor.charFormat()
charfmt.setBackground(color)
self.setCurrentCharFormat(charfmt)
self.setTextCursor(cursor)
def color_sections(self):
for n in range(self.sections.id.count()):
print("-----SECTION:%d-----" % (n))
section = self.sections.iloc[n]
self.blend_colors(section.start, section.end, section.r, section.g, section.b, section.a)
if __name__ == '__main__':
# Create database and sections to highlight
fn='qda_test_01.sqlite'
db=connect_database(fn)
id=create_data(db)
db.close()
app = QApplication(sys.argv)
window = QTextEdit2(
"In addition, the PySide.QtCore.QPoint class provides the PySide.QtCore.QPoint.manhattanLength() function which gives an inexpensive approximation of the length of the PySide.QtCore.QPoint object interpreted as a vector. Finally, PySide.QtCore.QPoint objects can be streamed as well as compared.")
window.show()
sys.exit(app.exec_())
最佳答案
如果您使用了我在previous answer中给您的代码,当前示例将正常工作。事实上,您的更改引入了许多相差一的错误。
要调试此问题,您应该首先检查以确定应突出显示哪些文本 block 。从数据库中获取文本的前 65 个字符和开始/结束值,得出:
>>> t = "In addition, the PySide.QtCore.QPoint class provides the PySide."
>>> t[0:20]
'In addition, the PyS'
>>> t[15:20]
'e PyS'
>>> t[18:30]
'ySide.QtCore'
>>> t[50:60]
'es the PyS'
如果将此与实际输出中的突出显示进行比较,您会发现没有任何部分正确匹配(例如,查看每个“PySide”中的“S”)。
要使其正常工作,您必须在开始时一次获取文本光标,使用它进行所有必要的更改,然后重新设置它一次强>最后:
cursor = self.textCursor()
for n in range(start, end):
...
cursor.setPosition(n)
cursor.movePosition(QTextCursor.NextCharacter, QTextCursor.KeepAnchor)
charfmt = cursor.charFormat()
charfmt.setBackground(color)
cursor.setCharFormat(charfmt)
cursor.clearSelection()
self.setTextCursor(cursor)
这类似于更新数据库:您使用游标来计划一系列更改,然后最后将它们作为单个操作提交。
关于python - 使用 PySide 和 QTextEdit(版本 2)的半透明突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46716741/
我使用 QTextEdit 的子类显示一些富文本内容. 一些编辑器——尤其是代码编辑器和 IDE 提供了一种可能性,可以一直滚动到最后一行之外,直到最后一行到达 View 的顶部。 我希望能够使用 Q
我已经放弃了让它跑得更快的实际尝试。 我最大的问题是,当我插入 html 时,应用程序会变慢到爬行。我有一个进度条,我正在调用 QCoreApplication.processEvents() (顺便
好吧,我正在做一个IDE系统。基本上,一切正常。虽然,但我有一个问题。 “QTextEdit”类没有用于自动完成的成员“setCompleter”。对? 那么,是否有一些类支持它,包括所有 QText
当我创建一个默认的 QTextEdit 小部件时,它会出现在默认的 Windows 样式边框中。我不想要这个边框,所以我试着把它关掉。我该怎么做? 我使用的是相当旧版本的 Qt (3.2.3)。 最佳
我想用QTextEdit (在只读模式下)显示可点击的超链接,我曾经这样做 QTextEdit *textEdit = new QTextEdit; QTextCursor cursor(textEd
我有一个仅从 qtextedit 返回选定文本的函数。我需要获取纯文本,但此函数返回带有一些控制字符的文本。 例如:函数textEdit->textCursor().selectedText()返回:
为QTextEdit设置文本: te->setPlainText(“Something”) ; te->adjustSize(); 应该只环绕“Something”,而不是QTextEdit正在扩展到
QTextEdit t; t.setHtml(" ");显示带有锐音符的小“a”而不是不间断空格。这种情况仅发生在 Windows 上,而不是 Linux 或 FreeBSD 上。可能是什么
感谢code,它帮助我解决了很多显示文本的问题。但是有一个符号困扰着我: [2K 但看起来像这样:在此处输入图片描述 据我理解ANSI中的该符号的意思-删除该行并在其位置写入新信息。我该怎么办? 最佳
文本编辑器:Sublime Text 3 Python 版本:3.6 UTF-8 PyQt5 我正在 PyQt5 中制作一个记事本,并且我正在制作一个能够在行之间导航的选项,当然,我需要移动文本编辑器
所以我尝试使用 shell 输出(实时)更新 QTextEdit: txtDirb = QTextEdit() dirb_command = "dirb" + " " + url p = subpro
我正在尝试尾随文件并将其连续输出到QTextEdit框。但是,我的子进程和输出位于多进程中。这是我的代码: shouldRun = True wMain = QtGui.QWidget() textb
我想升级我的日志部分以适应日志记录模块。 我的应用程序已经相当先进,并且使用 PySide 进行 GUI。我想设置处理程序来生成不同的日志文件,但也想设置一个写入 QTextEdit 类似控制台的小部
我的程序应该: 从 QLineEdits 收集一些输入; 将其转换为QString; 将其添加到一些常量的QString中; 单击按钮时在 QTextEdit 中输出全部内容。 下面是程序的简化模型。
我有一个带有某种日志查看器的应用程序,它需要能够呈现实时插入其中的格式化日志记录。 我在 Qt 中写这篇文章,到目前为止,我使用 QTextEdit 来呈现文本,使用一些 html 标签对其进行了美化
所以问题是如何从另一个表单设置 textEdit 的值? 最佳答案 您有两个选择,或者您可以简单地从另一个表单中的函数调用其中一个 setText 函数,如下所示: otherForm->setPla
我的 QMainWindow 上有一个 QTextEdit。我已经覆盖了我的主窗口 keyPressEvent 方法并在其中放置了一些热键处理程序(即:Ctrl+J、Ctrl+K)。这些热键对应用程序
是否有任何用于创建文本完成器的 QT 类(如果我键入“hel”,它会自动用“lo”完成单词)?抱歉用词不好,我不知道如何更好地描述它。 最佳答案 有 QCompleter,但默认情况下仅适用于 QLi
我目前正在开发一个文本编辑器,我想创建一个缩写系统。我的意思是,例如,当您编写 html5 然后按 tab 键时,例如您展开这样的代码: ... 也许我使用了错误的关键字,
我正在考虑使用 QTextEdit作为类似控制台的 IO 元素(用于串行数据)。这种方法的问题是(用户)输入和(通信)输出是混合的,它们可能不同步。 要检测新的用户输入,可以存储和比较某些输入事件的
我是一名优秀的程序员,十分优秀!