- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用方法 1 在 qtablewidget 行中查找一些文本。方法一:
def FindItem(self):
items = self.SuraBRS.findItems(
self.SearchTbox.text(), QtCore.Qt.MatchContains)
if items:
results = '\n'.join(
'row %d column %d' % (item.row() + 1, item.column() + 1)
for item in items)
else:
results = 'Found Nothing'
print(results)
现在我想知道如何突出显示结果或更改它们的颜色。我想选择并突出显示该文本或字符,而不是所有行或列。
最佳答案
为了能够仅更改文本的一部分,您必须使用我在此 other answer 中构建的 HTMLdelegate , 但必须修改它以避免更改可能是信息的 html 而不是所需的文本:
from PyQt5 import QtCore, QtGui, QtWidgets
import random
try:
from html import escape
except ImportError:
from cgi import escape
words = [
"Hello",
"world",
"Stack",
"Overflow",
"Hello world",
"""<font color="red">Hello world</font>""",
]
class HTMLDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, parent=None):
super(HTMLDelegate, self).__init__(parent)
self.doc = QtGui.QTextDocument(self)
def paint(self, painter, option, index):
substring = index.data(QtCore.Qt.UserRole)
painter.save()
options = QtWidgets.QStyleOptionViewItem(option)
self.initStyleOption(options, index)
res = ""
color = QtGui.QColor("orange")
if substring:
substrings = options.text.split(substring)
res = """<font color="{}">{}</font>""".format(
color.name(QtGui.QColor.HexRgb), substring
).join(list(map(escape, substrings)))
else:
res = escape(options.text)
self.doc.setHtml(res)
options.text = ""
style = (
QtWidgets.QApplication.style()
if options.widget is None
else options.widget.style()
)
style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter)
ctx = QtGui.QAbstractTextDocumentLayout.PaintContext()
if option.state & QtWidgets.QStyle.State_Selected:
ctx.palette.setColor(
QtGui.QPalette.Text,
option.palette.color(
QtGui.QPalette.Active, QtGui.QPalette.HighlightedText
),
)
else:
ctx.palette.setColor(
QtGui.QPalette.Text,
option.palette.color(QtGui.QPalette.Active, QtGui.QPalette.Text),
)
textRect = style.subElementRect(QtWidgets.QStyle.SE_ItemViewItemText, options)
if index.column() != 0:
textRect.adjust(5, 0, 0, 0)
thefuckyourshitup_constant = 4
margin = (option.rect.height() - options.fontMetrics.height()) // 2
margin = margin - thefuckyourshitup_constant
textRect.setTop(textRect.top() + margin)
painter.translate(textRect.topLeft())
painter.setClipRect(textRect.translated(-textRect.topLeft()))
self.doc.documentLayout().draw(painter, ctx)
painter.restore()
def sizeHint(self, option, index):
return QSize(self.doc.idealWidth(), self.doc.size().height())
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
hlay = QtWidgets.QHBoxLayout()
lay = QtWidgets.QVBoxLayout(self)
self.le = QtWidgets.QLineEdit()
self.button = QtWidgets.QPushButton("filter")
self.table = QtWidgets.QTableWidget(5, 5)
hlay.addWidget(self.le)
hlay.addWidget(self.button)
lay.addLayout(hlay)
lay.addWidget(self.table)
self.button.clicked.connect(self.find_items)
self.table.setItemDelegate(HTMLDelegate(self.table))
for i in range(self.table.rowCount()):
for j in range(self.table.columnCount()):
it = QtWidgets.QTableWidgetItem(random.choice(words))
self.table.setItem(i, j, it)
def find_items(self):
text = self.le.text()
# clear
allitems = self.table.findItems("", QtCore.Qt.MatchContains)
selected_items = self.table.findItems(self.le.text(), QtCore.Qt.MatchContains)
for item in allitems:
item.setData(QtCore.Qt.UserRole, text if item in selected_items else None)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
PyQt4:
from PyQt4 import QtCore, QtGui
import random
try:
from html import escape
except ImportError:
from cgi import escape
words = [
"Hello",
"world",
"Stack",
"Overflow",
"Hello world",
"""<font color="red">Hello world</font>""",
]
class HTMLDelegate(QtGui.QStyledItemDelegate):
def __init__(self, parent=None):
super(HTMLDelegate, self).__init__(parent)
self.doc = QtGui.QTextDocument(self)
def paint(self, painter, option, index):
substring = index.data(QtCore.Qt.UserRole)
if hasattr(substring, "toPyObject"):
substring = str(substring.toPyObject())
painter.save()
options = QtGui.QStyleOptionViewItem(option)
self.initStyleOption(options, index)
text = index.data()
if hasattr(text, "toPyObject"):
text = str(text.toPyObject())
res = ""
color = QtGui.QColor("orange")
if substring:
substrings = text.split(substring)
res = """<font color="{}">{}</font>""".format(color.name(), substring).join(
list(map(escape, substrings))
)
else:
res = escape(text)
self.doc.setHtml(res)
options.text = ""
style = (
QtGui.QApplication.style()
# if options.widget is None
# else options.widget.style()
)
style.drawControl(QtGui.QStyle.CE_ItemViewItem, options, painter)
ctx = QtGui.QAbstractTextDocumentLayout.PaintContext()
if option.state & QtGui.QStyle.State_Selected:
ctx.palette.setColor(
QtGui.QPalette.Text,
option.palette.color(
QtGui.QPalette.Active, QtGui.QPalette.HighlightedText
),
)
else:
ctx.palette.setColor(
QtGui.QPalette.Text,
option.palette.color(QtGui.QPalette.Active, QtGui.QPalette.Text),
)
textRect = (
options.rect
) # style.subElementRect(QtGui.QStyle.SE_ItemViewItemText, options)
if index.column() != 0:
textRect.adjust(5, 0, 0, 0)
thefuckyourshitup_constant = 4
margin = (option.rect.height() - options.fontMetrics.height()) // 2
margin = margin - thefuckyourshitup_constant
textRect.setTop(textRect.top() + margin)
painter.translate(textRect.topLeft())
painter.setClipRect(textRect.translated(-textRect.topLeft()))
self.doc.documentLayout().draw(painter, ctx)
painter.restore()
def sizeHint(self, option, index):
return QSize(self.doc.idealWidth(), self.doc.size().height())
class Widget(QtGui.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
hlay = QtGui.QHBoxLayout()
lay = QtGui.QVBoxLayout(self)
self.le = QtGui.QLineEdit()
self.button = QtGui.QPushButton("filter")
self.table = QtGui.QTableWidget(5, 5)
hlay.addWidget(self.le)
hlay.addWidget(self.button)
lay.addLayout(hlay)
lay.addWidget(self.table)
self.button.clicked.connect(self.find_items)
self.table.setItemDelegate(HTMLDelegate(self.table))
for i in range(self.table.rowCount()):
for j in range(self.table.columnCount()):
it = QtGui.QTableWidgetItem(random.choice(words))
self.table.setItem(i, j, it)
def find_items(self):
text = self.le.text()
# clear
allitems = self.table.findItems("", QtCore.Qt.MatchContains)
selected_items = self.table.findItems(self.le.text(), QtCore.Qt.MatchContains)
for item in allitems:
item.setData(QtCore.Qt.UserRole, text if item in selected_items else None)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
关于python - 在qtablewidget中突出显示搜索结果(选择并突出显示该文本或字符而不是所有行或列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51613638/
有谁知道的返回值之间的关系 QTableWidget::item(x, y) 和 QTableWidget::cellWidget (x, y) 在同一个 QTableWidget 和同一个 row
当我将按钮拖放到 QTableWidget 中时,按钮会从旧位置消失,并且我放置按钮的单元格中不会显示任何内容。 有人可以提出问题是什么吗? 请在下面找到代码 import sys from PyQt
我有一个 QTableWidget,我想在其中填充另一个 QTableWidget 的字段。 这是它的样子: -------------------------- Name | Class | Sec
我问了一个与此非常相似的问题,但回答者提供了少量帮助,我无法解决我的问题。我想我会重新问这个问题,因为没有其他人回答我的问题。我想知道如何将 QTableWidget 的数据从一个窗口复制到另一个窗口
我的程序遇到了一个问题,我不知道如何解决。问题是我在两个类中有一个Qtablewidget,我使用信号和槽机制来传输一个QVector,它包含一个类的QTablewidgetItems,并将它放在其他
我有一个问题:调用 QTableWidget::update 不会导致 QTableWidget::paintEvent。 简要说明:- QTableWidgetEx - 派生自 QTableWidg
我正在使用 QTableWidget,当用户单击特定行时,我使用该索引来执行某些操作。我还使用 setSortEnable 启用了排序,所以当我通过单击标题对其进行排序时,所有行索引都会更改,但我想要
假设我有一个充满数据的二维数组,比如 10 x 10。内容以及行数可以随时更改。 现在我想在 QTableWidget 中显示这些数据。 我使用超时 1 秒的计时器来刷新表格内容。在超时槽中,如果我使
QTableWidget 有搜索用户数据行的方法吗? 类似的东西: //set user data row->setData(0, Qt::UserRole, "ID001"); //find row
我使用 UI 编辑器创建 QTableWidget。 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui:
QTableWdiget对于简单的网格显示来说非常棒。更改颜色、字体等非常简单。 但是,我没有设法用更少的垂直空白来使网格看起来更“紧密”。我看到 Qt 文档讨论了(例如 here ) margin
可以为单元格设置占位符吗?我认为它可以通过为特定单元格设置 QLineEdit 来实现,但可能是 QTableWidget,或者 QTableWidgetItem 可以在没有自定义小部件的情况下做到这
当按下堆叠在左侧的按钮选择了 QTableWidget 中的整行时,是否有信号?我希望启用某些功能,但不确定如何启用? 提前致谢! 最佳答案 您有几个不同的选择。您所要求的最直接的方法是使用 QHea
在下面的代码中有两个样式表:problemStylesheet 和 okStylesheet。当我为 QTableWidget 使用 okStylesheet 时一切正常。标签在滚动。问题是如果我使用
QTableWidget由多个Selection Modi组成,可以通过方法进行选择 setSelectionMode (QAbstractItemView::SelectionMode mode)
我正在尝试使用最新的 Qt SDK (4.7.4) 来设置 QTableWidget 的样式。通过谷歌搜索,我发现我需要做这样的事情: QHeaderView::section { backg
我有一个 QTableWidget,我通过标题列使用它的默认排序功能,但我在 QTableWidget 中的一列是整数类型,并且通过 QTableWidget 默认排序它像字符串一样排序。所以有任何方
我有一个带有自定义小部件的 QTableWidget。这些小部件很大,几乎填满了整个滚动区域的高度,因此只有一行是可见的。 我可以用鼠标滚轮或拖动滚动条滚动,但行总是跳动。 有没有办法让QTableW
我尝试了 .setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) ,效果很好,但需要用户将鼠标移动到滚动条并使用它来体验平
我有一个带有自定义小部件的 QTableWidget。这些小部件很大,几乎填满了整个滚动区域的高度,因此只有一行是可见的。 我可以用鼠标滚轮或拖动滚动条滚动,但行总是跳动。 有没有办法让QTableW
我是一名优秀的程序员,十分优秀!