Cropo
Cropo

Reputation: 41

QTextEdit clickable text

I have a log I have created with a simple [Add] text near each line which I want to be able to press and have it run a function that will know which line/text it has in this line.

I can also use QTextBrowser if needed for this.

My code:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(401, 308)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.chat_log = QtWidgets.QTextEdit(self.centralwidget)
        self.chat_log.setGeometry(QtCore.QRect(10, 10, 381, 241))
        self.chat_log.setReadOnly(True)
        self.chat_log.setObjectName("chat_log")

        MainWindow.setCentralWidget(self.centralwidget)



class MainFrame(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainFrame, self).__init__(parent)
        self.setupUi(self)


    def appending(self):
        self.chat_log.append("Somethingsomething [Add]")
        self.chat_log.append("Hello[Add]")
        self.chat_log.append("What is up [Add]")
        self.chat_log.append("Big boy [Add]")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = MainFrame()
    form.show()
    form.appending()
    app.exec_()

Example

What I want is basically when someone pressed "[Add]" it will know which line it pressed and will print the text in that line

Say I pressed the first line it will then print("Somethingsomething")

Upvotes: 1

Views: 484

Answers (1)

Maurice Meyer
Maurice Meyer

Reputation: 18106

You need to make your [Add] texts clickable, the easiest way to do so is using HTML markup, then you just need to identify the text you had been clicking on:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class MyTextEdit(QtWidgets.QTextEdit):
    def mousePressEvent(self, e):
        self.link = self.anchorAt(e.pos())

    def mouseReleaseEvent(self, e):
        if self.link:
            print(f"Clicked on {self.link}")
            self.link = None


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(401, 308)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.chat_log = MyTextEdit(self.centralwidget)
        self.chat_log.setGeometry(QtCore.QRect(10, 10, 381, 241))
        self.chat_log.setReadOnly(True)
        self.chat_log.setObjectName("chat_log")
        MainWindow.setCentralWidget(self.centralwidget)


class MainFrame(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainFrame, self).__init__(parent)
        self.setupUi(self)

    def appending(self):
        messages = ["Somethingsomething", "Hello", "What is up", "Big bo"]
        for msg in messages:
            self.chat_log.append(
            f'<span>{msg}<a style="color: pink" href="{msg}">[Add]</a></span>'
        )


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = MainFrame()
    form.show()
    form.appending()
    app.exec_()

Out:

Clicked on Big bo
Clicked on Hello
Clicked on Somethingsomething

Upvotes: 2

Related Questions