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

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

23.03.2020, 13:17. Показов 2608. Ответов 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,764
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
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru