Да, меня тут осенило, если совместить мой первый код и второй, то получится то, что нужно. Ну собственно, уже слепил, работает.
# Python 3
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout,
QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox,
QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy,
QGroupBox, QFileDialog, QTextDocument)
from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor
from PyQt4.QtCore import QSize
tx = '''Константин бежал по дорожке, а потом колол дрова.
Кондрат собирал корения. На улице стоял колотун.
Иван же лежал в гамаке и пил кофе с конфетами.
ваер р
вп
фп пр
ко
афвп
ырап
авпопр
рпавап
фпре
ре р пар
ер екр
рвек'''
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class Window(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.resize(600, 250) # шир / выс окна
self.setWindowTitle('Поиск текста') # Заголовок
# БЛОК РАЗМЕТКИ
#grid_os = QGridLayout()
vbox = QVBoxLayout()
# ---
self.pole_vivod = QTextEdit('')
self.pole_vivod.setStyleSheet(sss_vivod)
self.pole_vivod.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction) # QtCore.Qt.TextEditorInteraction
vbox.addWidget(self.pole_vivod)
# ---
grid_UT = QGridLayout()
vbox.addLayout(grid_UT)
# --- --- поиск ---
self.btn_find_clear = QtGui.QPushButton('X')
self.btn_find_clear.clicked.connect(self.on_find_clear)
grid_UT.addWidget(self.btn_find_clear, 1,0)
# ---
self.btn_find_backward = QtGui.QPushButton('◄')
self.btn_find_backward.clicked.connect(self.on_find_backward)
grid_UT.addWidget(self.btn_find_backward, 1,1)
# ---
self.btn_find_forward = QtGui.QPushButton('►')
self.btn_find_forward.clicked.connect(self.on_find_forward)
grid_UT.addWidget(self.btn_find_forward, 1,2)
# ---
self.pole_find = QLineEdit(self)
self.pole_find.setToolTip('Поиск текста')
self.pole_find.textChanged.connect(self.on_find_text)
grid_UT.addWidget(self.pole_find, 1,3,1,10)
# ---
self.check_find_r = QtGui.QCheckBox("Р")
self.check_find_r.setToolTip('Учёт регистра')
grid_UT.addWidget(self.check_find_r, 1,14)
# настройка:
grid_UT.setColumnStretch(10, 1)
for i in range(10):
grid_UT.setColumnMinimumWidth(i, 10) # индекс / высота
# --- --- end: поиск ---
# ---
self.setLayout(vbox)
# --- ---
Window.on_start(self)
# ЛОГИКА
def on_start(self):
self.pole_vivod.append(str(tx))
self.pole_vivod.moveCursor(QtGui.QTextCursor.Start)
# === >>> ПОИСК ТЕКСТА ===
def on_find_text(self, text, opt=0):
check_find_r = self.check_find_r.isChecked()
if opt == 0:
self.pole_vivod.moveCursor(QtGui.QTextCursor.Start)
if check_find_r == 0: # без регистра
if opt == 0 or opt == 1:
self.pole_vivod.find(text)
else:
self.pole_vivod.find(text, QTextDocument.FindBackward)
else: # с регистром
if opt == 0 or opt == 1:
self.pole_vivod.find(text, QTextDocument.FindCaseSensitively)
else:
self.pole_vivod.find(text, QTextDocument.FindBackward | QTextDocument.FindCaseSensitively)
def on_find_forward(self): # поиск вперёд
text = self.pole_find.text()
self.on_find_text(text, 1)
def on_find_backward(self): # поиск назад
text = self.pole_find.text()
self.on_find_text(text, 2)
def on_find_clear(self): # очистить поиск
self.pole_find.blockSignals(1) # блокировка сигналов
self.pole_find.clear()
self.pole_find.blockSignals(0) # отмена блокировки сигналов
cursor = self.pole_vivod.textCursor()
posit = cursor.position() # позиц курсора
cursor.movePosition(posit) # происходит сброс выделения
self.pole_vivod.setTextCursor(cursor)
# === >>> END: ПОИСК ТЕКСТА ===
# КОНЕЦ
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())