QTableView 中的换行符
Linebreak in QTableView
我的 GUI 中有一个 QTableView,我希望其中有一些 table 单元格,我可以在其中使用 \n
或 <br>
之类的东西插入换行符。
到目前为止,我已经尝试将 QLabel 设置为 IndexWidget:
l = QLabel(val[2])
self.setRowHeight(i, int(l.height() / 8))
l.setAutoFillBackground(True)
self.setIndexWidget(QAbstractItemModel.createIndex(self.results_model, i, 2), l)
这种方法的问题是代码不是很干净,如果没有这段代码用小部件替换单元格,就不能在 AbstractTableModel 中完成。第二个问题是,在其中选择一个带有小部件的行时,蓝色突出显示不适用于单元格。另一个问题是 resizeRowsToContents() 方法没有考虑这个小部件的高度。
任何想法将不胜感激,谢谢!
实现此任务的一种方法是使用 HtmlDelegate,在这种情况下,换行符将由 <br>
:
给出
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class HTMLDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
opt = QStyleOptionViewItem(option)
self.initStyleOption(opt, index)
painter.save()
doc = QTextDocument()
doc.setHtml(opt.text)
opt.text = "";
style = opt.widget.style() if opt.widget else QApplication.style()
style.drawControl(QStyle.CE_ItemViewItem, opt, painter)
painter.translate(opt.rect.left(), opt.rect.top())
clip = QRectF(0, 0, opt.rect.width(), opt.rect.height())
doc.drawContents(painter, clip)
painter.restore()
def sizeHint(self, option, index ):
opt = QStyleOptionViewItem(option)
self.initStyleOption(opt, index)
doc = QTextDocument()
doc.setHtml(opt.text);
doc.setTextWidth(opt.rect.width())
return QSize(doc.idealWidth(), doc.size().height())
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QTableView()
model = QStandardItemModel(4, 6)
delegate = HTMLDelegate()
w.setItemDelegate(delegate)
w.setModel(model)
w.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
w.show()
sys.exit(app.exec_())
我的 GUI 中有一个 QTableView,我希望其中有一些 table 单元格,我可以在其中使用 \n
或 <br>
之类的东西插入换行符。
到目前为止,我已经尝试将 QLabel 设置为 IndexWidget:
l = QLabel(val[2])
self.setRowHeight(i, int(l.height() / 8))
l.setAutoFillBackground(True)
self.setIndexWidget(QAbstractItemModel.createIndex(self.results_model, i, 2), l)
这种方法的问题是代码不是很干净,如果没有这段代码用小部件替换单元格,就不能在 AbstractTableModel 中完成。第二个问题是,在其中选择一个带有小部件的行时,蓝色突出显示不适用于单元格。另一个问题是 resizeRowsToContents() 方法没有考虑这个小部件的高度。
任何想法将不胜感激,谢谢!
实现此任务的一种方法是使用 HtmlDelegate,在这种情况下,换行符将由 <br>
:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class HTMLDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
opt = QStyleOptionViewItem(option)
self.initStyleOption(opt, index)
painter.save()
doc = QTextDocument()
doc.setHtml(opt.text)
opt.text = "";
style = opt.widget.style() if opt.widget else QApplication.style()
style.drawControl(QStyle.CE_ItemViewItem, opt, painter)
painter.translate(opt.rect.left(), opt.rect.top())
clip = QRectF(0, 0, opt.rect.width(), opt.rect.height())
doc.drawContents(painter, clip)
painter.restore()
def sizeHint(self, option, index ):
opt = QStyleOptionViewItem(option)
self.initStyleOption(opt, index)
doc = QTextDocument()
doc.setHtml(opt.text);
doc.setTextWidth(opt.rect.width())
return QSize(doc.idealWidth(), doc.size().height())
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QTableView()
model = QStandardItemModel(4, 6)
delegate = HTMLDelegate()
w.setItemDelegate(delegate)
w.setModel(model)
w.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
w.show()
sys.exit(app.exec_())