Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 538

Как нарисовать поверх картинки?

23.03.2020, 13:17. Показов 2571. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Я отображаю картинку вот таким кодом (в PyQt5):
Python
1
2
3
4
5
6
7
8
9
10
11
12
    def showDialog(self):
 
        fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')[0]
        pixmap = QPixmap(fname)
        width=pixmap.width()
        height=pixmap.height()
        if(width>self.max_width):
            w=self.max_width
            h=int(self.max_width/width*height)
            pixmap=pixmap.scaled(w,h)#,Qt.KeepAspectRatio)
            #print(pixmap.width())
        self.label.setPixmap(pixmap)
И мне нужно поверх нее нарисовать прямоугольник, типипа выделаны область на картинке.
Попробовал так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    def eventFilter(self, object, event):
        if object==self.label:
            if event.type() == QEvent.MouseButtonDblClick:
                self.point1 = None
            if event.type() == QEvent.MouseMove:
                if self.point1 == None:
                    self.point1 = event.pos()
                    print("Начало ",self.point1)
                else:
                    self.point2 = event.pos()
            if event.type() == QEvent.MouseButtonRelease:
                print("Конец ", self.point2)
                self.drawRect()
        return False
 
    def drawRect(self):
        if self.point1!=None:
            col = QColor(255, 0, 0)
            qp = QPainter()
            qp.begin(self)
            qp.setPen(col)
            qp.drawRect(self.point1.x(),self.point1.y(),self.point2.x(),self.point2.y())
            qp.end()
Картинка не рисуется.
Попробовал вот так:

PHP/HTML
1
2
3
4
5
6
7
8
9
10
    def paintEvent(self, e):
        qp = QPainter()
        qp.begin(self)
        self.drawLines(qp)
        qp.end()
 
    def drawLines(self, qp):
        pen = QPen(Qt.black, 2, Qt.SolidLine)
        qp.setPen(pen)
        qp.drawLine(20, 40, 250, 400)
Рисует линию, но стоит только загрузить картинку, как картинка закрывает часть этой линии. Подскажите, пожалуйста, как мне нарисовать что-нибудь поверх картинки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2020, 13:17
Ответы с готовыми решениями:

Как поверх иконки нарисовать изображение из файла?
Приветствуется любая инфа по сабжу. Задача изменить иконки в дереве в зависимости от свойств файла. В дереве используется немного...

В окно вывести поверх картинки круг
Приветствую.Необходимо в окно вывести поверх картинки круг с радиусом Gppp(Это забирается из entry значение).Круг выводится,а вот картинка...

Нарисовать картинку поверх картинки
Доброго времени суток. Подскажите с проблемкой. Не могу понять никак, как решить её. Загружаю в Image картинку jpg. теперь хочу...

8
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
23.03.2020, 19:09
попробуйте через QGraphicsScene и QGraphicsItem с его методом setZValue()
1
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 538
24.03.2020, 14:40  [ТС]
Цитата Сообщение от Lekks Посмотреть сообщение
попробуйте через QGraphicsScene и QGraphicsItem с его методом setZValue()
Попробовал сделать вот так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class CustomGraphicsView(QGraphicsView):
    def __init__(self, scene):
        super().__init__(scene)
        self.x = 0
        self.y = 0
        self.rect = None
        self.max_width = 1200
        self.pixmap = None
        self.image = self.scene().addPixmap(QPixmap("D:\\1\\2.png"))
        self.scene().addRect(10, 10, 50, 150)
 
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.core = Core()
        self.init_UI()
 
    def init_UI(self):
        vbox = QVBoxLayout()
        self.setLayout(vbox)
        self.graphics_scene = QGraphicsScene(self)
        self.graphics_view = CustomGraphicsView(self.graphics_scene)
        #self.graphics_view.setAlignment(Qt.AlignTop | Qt.AlignLeft)
        vbox.addWidget(self.graphics_view)
Работает, появляется одновременно и картинка и линии. Но окно является наследником от QWidget и там нельзя, например, вот так:
Python
1
2
3
4
5
6
7
8
        openFile = QAction(QIcon('open.png'), 'Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open new File')
        openFile.triggered.connect(self.showDialog)
 
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(openFile)
Говорит что нет menuBar()

А если я наследую окно от QMainWindow, то не работают картинки (просто не показывает их).
Как быть?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,762
24.03.2020, 15:13
типа так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class View(QMainWindow):
    def __init__(self):
        super().__init__()
        self.scene = QGraphicsScene()
        self.view = QGraphicsView(self.scene)
        self.view.setScene(self.scene)
        self.setCentralWidget(self.view)
        
        label = QLabel('<H1><font color=red>Label</font></h1>')
        label.setAlignment(Qt.AlignCenter)
        label.setStyleSheet("background-color: green")
        label.resize(400,300)
        proxy = self.scene.addWidget(label)
 
if __name__ == '__main__':
    app = QApplication([])
    w = View()
    w.show()
    app.exec_()
1
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
24.03.2020, 15:40
Ну, в общем, то все сказал vic5710,
0
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 538
24.03.2020, 16:08  [ТС]
Сделал так:
Python
1
2
3
4
5
6
7
8
9
10
11
        self.scene = QGraphicsScene()
        self.view = QGraphicsView(self.scene)
        self.view.setScene(self.scene)
        self.setCentralWidget(self.view)
 
        self.label = QLabel(self)
        self.label.setAlignment(Qt.AlignTop)
        self.label.resize(self.max_width, 700)
        self.label.installEventFilter(self)
        self.scene.addWidget(self.label)
        self.statusBar()
Затем вот так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
        
        self.core.filename = QFileDialog.getOpenFileName(self, 'Open file', '/home')[0]
        pixmap = QPixmap(self.core.filename)
        width=pixmap.width()
        height=pixmap.height()
        if(width>self.max_width):
            self.k_ratio=self.max_width/width
            w=self.max_width
            h=int(self.k_ratio*height)
            pixmap=pixmap.scaled(w,h) 
 
        self.label.setPixmap(pixmap)
        self.scene.addRect(50, 50, 500, 500)
И все равно картинка закрывает нарисованные линии.

Добавлено через 19 минут
Помогло когда засунул картинку не в метку а в саму схему, вот так:

Python
1
2
3
        #self.label.setPixmap(pixmap)
        self.scene.addPixmap(pixmap)
        self.scene.addRect(50, 50, 500, 500)
Добавлено через 19 секунд
Спасибо всем.
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
24.03.2020, 17:07
Не успел)))
0
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 538
25.03.2020, 14:06  [ТС]
И все равно вопрос остался, а как перехватывать события от мыши в случае использования QGraphicsView?
Теперь делают так:
Python
1
2
3
4
5
6
7
        
        self.scene = QGraphicsScene()
        self.view = QGraphicsView(self.scene)
        self.view.setScene(self.scene)
        self.setCentralWidget(self.view)
        self.view.setAlignment(Qt.AlignTop)
        self.view.installEventFilter(self)
А событие eventFilter:
Python
1
2
3
    
def eventFilter(self, obj, event):
        print(event.type())
Реагирует только на нажатие кнопки мыши, а мне надо еще на отпускание и на перемежение мыши.

Добавлено через 3 минуты
И почему-то не работает

Python
1
2
3
4
5
    
    def eventFilter(self, obj, event):
        #print(event.type())
        if event.type()==PyQt5.QtGui.QMouseEvent:
            print(obj,event)
то есть не выполняется строка print(obj,event) когда я кликаю мышкой

Добавлено через 20 минут
Пробую перехватить события мыши у QGraphicsView

Python
1
2
3
4
5
6
7
class MainView(QGraphicsView):
    def mouseMoveEvent(self, event):
        print("move ",event.pos())
    def mouseButtonReleaseEvent(self, event):
        print("relese ", event.pos())
    def mouseButtonDblClickEvent(self, event):
        print("dbl ", event.pos())
Но работает почему-то только перемещение мыши
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
27.03.2020, 17:31
попробуйте что-то вроде:

Python
1
2
3
def event (self, e):
    if e.type() == QtCore.QEvent.MouseMove:
        print('Движение')
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2020, 17:31
Помогаю со студенческими работами здесь

Как кнопку из под картинки перенести поверх картинки ?
сначала я установил на форму кнопку, потом картинку - следовательно, при перетаскивании кнопки в область картинки - кнопка прячется под...

Как нарисовать сетку поверх рисунка
Сейчас долго гуглил, но так и не нашёл. Метод: System.Drawing.Graphics g =...

Как нарисовать прямоугольник поверх флекса
Попробовал, не получилось. Может кто подскажет?

Как написать текст поверх картинки
Добрый вечер! Подскажите пожалуйста как написать текст по верх картинки размещенной в таблице. Создаю внутреннюю таблицу в таблице с...

Как расположить элементы поверх картинки?
Доброе утро, форумчане! Который день пытаюсь прилепить текст комментариев и заголовок к картинке через position, но они никак не желают...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru