Вы должны использовать делегата, который использует QTextDocument
:
import random
from PySide2 import QtCore, QtGui, QtWidgets
words = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Mauris euismod cursus mi sit amet pellentesque.
Proin sed lectus sed augue scelerisque congue eget quis leo.
Curabitur ultrices nisi nisi, placerat gravida urna sagittis et.
Nullam vitae urna tortor. Curabitur a lobortis metus, et laoreet arcu.
Quisque a mi in purus molestie porta non sit amet purus.
Sed porta non purus et suscipit.'''.split()
class HighlightDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, parent=None):
super(HighlightDelegate, self).__init__(parent)
self.doc = QtGui.QTextDocument(self)
self._regex = QtCore.QRegularExpression()
self._highlight_format = QtGui.QTextCharFormat()
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()
highlightCursor = QtGui.QTextCursor(self.doc)
while not highlightCursor.isNull() and not highlightCursor.atEnd():
highlightCursor = self.doc.find(self.regex, highlightCursor)
if not highlightCursor.isNull():
highlightCursor.mergeCharFormat(self.highlightFormat)
cursor.endEditBlock()
@property
def regex(self):
return self._regex
@regex.setter
def regex(self, regex):
if self._regex == regex: return
self._regex = regex
@property
def highlightFormat(self):
return self._highlight_format
@highlightFormat.setter
def highlightFormat(self, fmt):
self._highlight_format = fmt
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.table = QtWidgets.QTableView()
self._delegate = HighlightDelegate(self.table)
self._delegate.regex = QtCore.QRegularExpression(r"\(.*?\)")
fmt = QtGui.QTextCharFormat()
fmt.setForeground(QtCore.Qt.green)
fmt.setFontWeight(QtGui.QFont.Bold)
self._delegate.highlightFormat = fmt
self.table.setItemDelegate(self._delegate)
model = QtGui.QStandardItemModel(10, 4)
for i in range(model.rowCount()):
for j in range(model.columnCount()):
item = QtGui.QStandardItem("{}({}){}".format(*random.sample(words,3)))
model.setItem(i, j, item)
self.table.setModel(model)
self.setCentralWidget(self.table)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Моя первая мысль заключалась в том, что кодировка является Unicode при разборке XML из типа строки .net. Кажется, хотя разборы XDocument довольно прощают в отношении этого.
Проблема фактически связана с отметкой преамбулы UTF8 (BOM), которая является трехбайтовой подписью , необязательно присутствующая в начале потока UTF-8. Эти три байта - это подсказка относительно кодирования, используемого в потоке.
Вы можете определить преамбулу кодировки, вызывая метод GetPreamble
на экземпляр System.text.encoding
класса.
Например:
// returns { 0xEF, 0xBB, 0xBF }
byte[] preamble = Encoding.UTF8.GetPreamble();
Преамбула должна быть обработана правильно XMLTExtreader
, так что просто загрузите XDocument
из XMLTExtreader
:
XDocument xml;
using (var xmlStream = new MemoryStream(fileContent))
using (var xmlReader = new XmlTextReader(xmlStream))
{
xml = XDocument.Load(xmlReader);
}
-121--1412911- Вы пересекаете границу процесса, ссылки на объекты не действительны в другом процессе. Класс DataObject поддерживает сериализацию объектов, чтобы получить их через стену, он использует двоичный дискформ. Итак, да, вам нужно будет применить атрибут [Serializable] в свой класс и убедитесь, что ваши объекты могут быть переданы / сериализовать правильно.
-121--3732571-Если вы устанавливаете свойство WebRequest.defaultWebProxy для нового WebProxy с учетными данными, WCF будет использовать его для всех HTTP-запросов, которые он делает. (Это повлияет на все httpwebrequests, используемых приложением, если явно не переопределен).
// get this information from the user / config file / etc.
Uri proxyAddress;
string userName;
string password;
// set this before any web requests or WCF calls
WebRequest.DefaultWebProxy = new WebProxy(proxyAddress)
{
Credentials = new NetworkCredential(userName, password),
};
Мои Сообщение блога на прокси-серверах содержит дополнительные данные.
Удостоверения клиента, которые Вы устанавливаете, прекрасны для аутентификации к сервисам.
Для аутентификации прокси необходимо использовать HttpTransportSecurity. ProxyCredentials.
Эта ссылка могла бы выручить Вас.