- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何设置 QTableWidgetcolumn 的宽度,并使每个单元格中的文本在其宽度大于设置宽度的情况下从新行开始(有点像 Excel 中允许文本自动换行) )。现在,每个单元格的孔文本都写在很长的一行中,但我希望在 destop 应用程序中查看/可读是很好的。因此,我希望将文本保留在一个单元格中,但有一个自动换行/使文本中有新行。
这是我的代码,其中包含 self.table.setWordWrap(True)
命令,该命令不会执行任何操作。请注意,整个 qtablewidget 已被覆盖以对文本进行着色(我认为这可能是自动换行可能不起作用的问题):
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport
import sys
found_words_num =int ('100')
data_single = {'Position':['hallo i like to do this and it would be nice if there was a new line. othere lines and so one.','b'], 'LV-Text': ['c','d'], 'Fundwörter': ['e','f'], 'Hersteller': ['g','h']}
words_in_columns = ['a','b']
textMargins = 12
borderMargins = 10
class HighlightDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, parent=None):
super(HighlightDelegate, self).__init__(parent)
self.doc = QtGui.QTextDocument(self)
self._filters = []
def paint(self, painter, option, index):
painter.save()
options = QtWidgets.QStyleOptionViewItem(option)
self.initStyleOption(options, index)
self.doc.setPlainText(options.text)
self.apply_highlight()
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)
the_constant = 4
margin = (option.rect.height() - options.fontMetrics.height()) // 2
margin = margin - the_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 apply_highlight(self):
cursor = QtGui.QTextCursor(self.doc)
cursor.beginEditBlock()
fmt = QtGui.QTextCharFormat()
fmt.setForeground(QtCore.Qt.red)
for f in self.filters():
highlightCursor = QtGui.QTextCursor(self.doc)
while not highlightCursor.isNull() and not highlightCursor.atEnd():
highlightCursor = self.doc.find(f, highlightCursor)
if not highlightCursor.isNull():
highlightCursor.mergeCharFormat(fmt)
cursor.endEditBlock()
@QtCore.pyqtSlot(list)
def setFilters(self, filters):
if self._filters == filters: return
self._filters = filters
def filters(self):
return self._filters
class main_result_pos(QtWidgets.QWidget):
def __init__(self, parent=None):
super(main_result_pos, self).__init__(parent)
self.setGeometry(50, 50, 1100, 850) # Fenstergröße festlegen
self.table = QTableWidget(self)
self.table.setGeometry(QtCore.QRect(10, 10, 900, 600))
self.table.setRowCount(found_words_num)
self.table.setColumnCount(6)
self.table.setSortingEnabled(True)
self.table.setWordWrap(True)
self._delegate = HighlightDelegate(self.table) ##Klasse aufrufen
self.table.setItemDelegate(self._delegate)
le = QtWidgets.QLineEdit()
le.textChanged.connect(self.on_textChanged)
search_list = [word for column in words_in_columns for word in column]
list_c_str = ' '.join(search_list)
le.setText(list_c_str)
horHeaders = []
for col, key in enumerate(sorted(data_single.keys())):
horHeaders.append(key)
for row, item in enumerate(data_single[key]):
newitem = QTableWidgetItem(item)
newitem.setTextAlignment(QtCore.Qt.AlignCenter)
self.table.setItem(row, col, newitem)
self.table.setHorizontalHeaderLabels(['A', 'B','C', 'D' , 'E', 'F'])
self.table.resizeRowsToContents()
self.table.resizeColumnsToContents()
@QtCore.pyqtSlot(str)
def on_textChanged(self, text):
self._delegate.setFilters(list(set(text.split())))
self.table.viewport().update()
def main():
app = QApplication(sys.argv)
ex = main_result_pos()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
最佳答案
除了将垂直标题的sectionResizeMode设置为QHeaderView::ResizeToContents之外,还必须在QTextDocument中启用自动换行:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class HighlightDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, parent=None):
super(HighlightDelegate, self).__init__(parent)
self._filters = []
self._wordwrap = False
self.doc = QtGui.QTextDocument(self)
def paint(self, painter, option, index):
painter.save()
options = QtWidgets.QStyleOptionViewItem(option)
self.initStyleOption(options, index)
self.doc.setPlainText(options.text)
self.apply_highlight()
if self._wordwrap:
self.doc.setTextWidth(options.rect.width())
options.text = ""
style = QApplication.style() if options.widget is None else options.widget.style()
style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter)
if self._wordwrap:
painter.translate(options.rect.left(), options.rect.top())
clip = QtCore.QRectF(QtCore.QPointF(), QtCore.QSizeF(options.rect.size()))
self.doc.drawContents(painter, clip)
else:
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, None)
if index.column() != 0:
textRect.adjust(5, 0, 0, 0)
constant = 4
margin = (option.rect.height() - options.fontMetrics.height()) // 2
margin = margin - constant
textRect.setTop(textRect.top() + margin)
painter.translate(textRect.topLeft())
painter.setClipRect(textRect.translated(-textRect.topLeft()))
self.doc.documentLayout().draw(painter, ctx)
painter.restore()
s = QtCore.QSize(self.doc.idealWidth(), self.doc.size().height())
index.model().setData(index, s, QtCore.Qt.SizeHintRole)
def apply_highlight(self):
cursor = QtGui.QTextCursor(self.doc)
cursor.beginEditBlock()
fmt = QtGui.QTextCharFormat()
fmt.setForeground(QtCore.Qt.red)
for f in self.filters():
highlightCursor = QtGui.QTextCursor(self.doc)
while not highlightCursor.isNull() and not highlightCursor.atEnd():
highlightCursor = self.doc.find(f, highlightCursor)
if not highlightCursor.isNull():
highlightCursor.mergeCharFormat(fmt)
cursor.endEditBlock()
@QtCore.pyqtSlot(list)
def setFilters(self, filters):
if self._filters == filters: return
self._filters = filters
self.parent().viewport().update()
def filters(self):
return self._filters
def setWordWrap(self, on):
self._wordwrap = on
mode = QtGui.QTextOption.WordWrap if on else QtGui.QTextOption.WrapAtWordBoundaryOrAnywhere
textOption = QtGui.QTextOption(self.doc.defaultTextOption())
textOption.setWrapMode(mode)
self.doc.setDefaultTextOption(textOption)
self.parent().viewport().update()
data_single = {'Position':['hallo i like to do this and it would be nice if there was a new line. othere lines and so one.','b'], 'LV-Text': ['c','d'], 'Fundwörter': ['e','f'], 'Hersteller': ['g','h']}
words_in_columns = ['a','b']
class main_result_pos(QtWidgets.QWidget):
def __init__(self, parent=None):
super(main_result_pos, self).__init__(parent)
self.table = QtWidgets.QTableWidget(100, 6)
self.table.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
self.table.setSortingEnabled(True)
self._delegate = HighlightDelegate(self.table)
self.table.setItemDelegate(self._delegate)
le = QtWidgets.QLineEdit(textChanged=self.on_textChanged)
search_list = [word for column in words_in_columns for word in column]
list_c_str = ' '.join(search_list)
le.setText(list_c_str)
horHeaders = []
for col, key in enumerate(sorted(data_single.keys())):
horHeaders.append(key)
for row, item in enumerate(data_single[key]):
newitem = QtWidgets.QTableWidgetItem(item)
self.table.setItem(row, col, newitem)
self.table.setHorizontalHeaderLabels(horHeaders)
self._delegate.setWordWrap(True)
self.resize(640, 480)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(le)
lay.addWidget(self.table)
@QtCore.pyqtSlot(str)
def on_textChanged(self, text):
self._delegate.setFilters(list(set(text.split())))
def main():
app = QtWidgets.QApplication(sys.argv)
ex = main_result_pos()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
关于python - Pyqt QTablewidget 自动换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759776/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!