Skip to main content

PyQt5 drawing lines that have mouse events

I have an application where I draw 2 custom widgets and then draw a line between them. I want to add a mousePressEvent to the line.

What would be the best way to do this?

I suppose I could create a QWidget of x pixel thickness and y length and then fill in the whole widget with the colour I want the line to have. Then the QWidget has the mousePressEvent that I can override. This doesn't seem like the most elegant solution and feels more like a workaround. Is there a better way?

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPaintEvent, QPainter, QPen, QFont
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel


class MyWidget(QWidget):
    def __init__(self, name, parent):
        super().__init__(parent)
        self.setAutoFillBackground(True)
        self.setFixedSize(300, 100)
        p = self.palette()
        p.setColor(self.backgroundRole(), Qt.white)
        self.setPalette(p)

        lbl_name = QLabel(name, self)
        lbl_name.setFont(QFont('Arial', 16))
        lbl_name.move((self.width() - lbl_name.width()) / 2, self.height()/2 - lbl_name.height()/2)


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.main_widget = QWidget(self)

        self.widget_1 = MyWidget("Widget 1", self)
        self.widget_1.move(50, 50)
        self.widget_2 = MyWidget("Widget 2", self)
        self.widget_2.move(700, 600)

        self.resize(1200, 800)
        self.setCentralWidget(self.main_widget)

    def paintEvent(self, a0: QPaintEvent) -> None:
        super().paintEvent(a0)
        painter = QPainter(self)
        painter.setPen(QPen(Qt.red, 3, Qt.SolidLine))

        widget_1_x = self.widget_1.pos().x() + self.widget_1.size().width()
        widget_1_y = self.widget_1.pos().y() + self.widget_1.size().height() / 2
        widget_2_x = self.widget_2.pos().x()
        widget_2_y = self.widget_2.pos().y() + self.widget_2.size().height() / 2
        halfway_x = widget_1_x + (widget_2_x - widget_1_x) / 2

        # add mousePressEvents to these lines:
        painter.drawLine(widget_1_x, widget_1_y, halfway_x, widget_1_y)
        painter.drawLine(halfway_x, widget_1_y, halfway_x, widget_2_y)
        painter.drawLine(halfway_x, widget_2_y, widget_2_x, widget_2_y)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    myapp = MainWindow()
    myapp.show()
    sys.exit(app.exec_())

How the above code looks like when run How the above code looks like when run



source https://stackoverflow.com/questions/71959812/pyqt5-drawing-lines-that-have-mouse-events

Comments

Popular posts from this blog

Prop `className` did not match in next js app

I have written a sample code ( Github Link here ). this is a simple next js app, but giving me error when I refresh the page. This seems to be the common problem and I tried the fix provided in the internet but does not seem to fix my issue. The error is Warning: Prop className did not match. Server: "MuiBox-root MuiBox-root-1" Client: "MuiBox-root MuiBox-root-2". Did changes for _document.js, modified _app.js as mentioned in official website and solutions in stackoverflow. but nothing seems to work. Could someone take a look and help me whats wrong with the code? Via Active questions tagged javascript - Stack Overflow https://ift.tt/2FdjaAW

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console