Создание эквалайзера на PyQt5 и встраивание его в в Qt Desinger

Делаю mp3 проигрыватель на Python в PyQt5, а шаблон делал в Qt Desinger. Осталось прикрутить эквалайзер. В интернете нашел код Qtwidgets и его модификации. Как прикрутить этот эквалайзер к интерфейсу программы?

Как вставить этот код в Qt Desinger ?

https://www.learnpyqt.com/widgets/equalizerbar/

import sys
import random
#from PySide2 import QtCore, QtGui, QtWidgets   # !!!
#from PySide2.QtCore import Qt                  # !!!
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt


 class Equalizer_Bars(QtWidgets.QWidget):
    def __init__(self, bars, steps, *args, **kwargs):
         super().__init__(*args, **kwargs)
         # это соответствует размеру в области эквалайзера
        self.setSizePolicy(
        QtWidgets.QSizePolicy.MinimumExpanding,
        QtWidgets.QSizePolicy.MinimumExpanding
      )

    if isinstance(steps, list):
        # список цветов.
        self.n_steps = len(steps)
        self.steps = steps

    elif isinstance(steps, int):
        # int количество баров, по умолчанию синий.
        self.n_steps = steps
        self.steps = ['blue'] * steps
    else:
        raise TypeError('переменная шагов установлена неправильно, попробуйте с помощью списка или ...')

Ответы (1 шт):

Автор решения: S. Nick

Не надо так быстро сдаваться, я же вам писал, если не получится - приведете пример вашего модуля .ui.

main.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import Qt


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        # Загрузите страницу интерфейса
        uic.loadUi('equalizer.ui', self)
        
        self.pushButton.clicked.connect(self.onStart)
        self.pushButton_2.clicked.connect(self.onStop)

    def onStart(self):        
        self.EqualizerWidget.set_timer.start()
        
    def onStop(self):        
        self.EqualizerWidget.set_timer.stop()
        

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

equalizer.py

Внимание, в этот модуль были внесены изменения!

import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt


class EqualizerBar(QtWidgets.QWidget):
    def __init__(self, bars=8, steps=[], parent=None):
        super().__init__(parent)
        
        # это соответствует размеру в области эквалайзера
        self.setSizePolicy(
            QtWidgets.QSizePolicy.MinimumExpanding,
            QtWidgets.QSizePolicy.MinimumExpanding
        )

        if isinstance(steps, list):
            # список цветов.
            self.n_steps = len(steps)
            self.steps = steps

        elif isinstance(steps, int):
            # int количество баров, по умолчанию синий.
            self.n_steps = steps
            self.steps = ['blue'] * steps
        else:
            raise TypeError('переменная шагов установлена неправильно, попробуйте с помощью списка или int')

        # создать bars
        self.set_bars = bars
        # определить настройки баров
        self.set_space_between_bars = 1
        self.set_height_of_bars = 1
        # установить цвет фона
        self.set_background_color = QtGui.QColor('white')
        # установить отступ по пикселю
        self.set_padding = 10  

        # create timer 
        self.set_timer = None
        # установить затухание для баров движения
        self.set_decay_frequency_ms(76)
        self.set_decay_value = 10

        # установить значения для minim and maxim 
        self.set_min_value = 0
        self.set_max_value = 100

        # сохранить все текущие значения в списке.
        self.set_all_values = [0.0] * bars

    def paintEvent(self, e):
        # create painter
        painter = QtGui.QPainter(self)
        # создать brush для рисования
        brush = QtGui.QBrush()
        brush.setColor(self.set_background_color)
        brush.setStyle(Qt.SolidPattern)
        rect = QtCore.QRect(0, 0, painter.device().width(), painter.device().height())
        painter.fillRect(rect, brush)

        # установить canvas
        d_height = painter.device().height() - (self.set_padding * 2)
        d_width = painter.device().width() - (self.set_padding * 2)

        # установить bars
        step_y = d_height / self.n_steps
        bar_height = step_y * self.set_height_of_bars
        bar_height_space = step_y * (1 - self.set_space_between_bars) / 2

        step_x = d_width / self.set_bars
        bar_width = step_x * self.set_space_between_bars
        bar_width_space = step_x * (1 - self.set_height_of_bars) / 2

        for i in range(self.set_bars):
            # вычисление позиции y для этого бара для остановки, из значения в диапазоне.
            c = (self.set_all_values[i] - self.set_min_value) / (self.set_max_value - self.set_min_value)
            n_steps_to_draw = int(c * self.n_steps)
            for n in range(n_steps_to_draw):
                brush.setColor(QtGui.QColor(self.steps[n]))
                rect = QtCore.QRect(
                    self.set_padding + (step_x * i) + bar_width_space,
                    self.set_padding + d_height - ((1 + n) * step_y) + bar_height_space,
                    bar_width,
                    bar_height
                )
                painter.fillRect(rect, brush)
        painter.end()

    def _trigger_refresh(self):
        self.update()

    def set_decay_trick(self, f):
        self.set_decay_value = float(f)

    def set_decay_frequency_ms(self, ms):
        if self.set_timer:
            self.set_timer.stop()
        if ms:
            self.set_timer = QtCore.QTimer()
            self.set_timer.setInterval(ms)
            self.set_timer.timeout.connect(self.set_decay_beat)
            self.set_timer.start()

    def set_decay_beat(self):
        self.set_all_values = [
            max(0, v - self.set_decay_value)
            for v in self.set_all_values
        ]
        self.update()                         # Перерисовать новую позицию.

    def size_values(self, v):
        self.set_all_values = v
        self.update()

    def values(self):
        return self.set_all_values

    def set_range(self, vmin, vmax):
        assert float(vmin) < float(vmax)
        self.set_min_value, self.set_max_value = float(vmin), float(vmax)

    # будет использоваться с QBrush
    def setColor(self, color):
        self.steps = [color] * self._bar.n_steps
        self.update()

    def set_color_bars(self, colors):
        self.n_steps = len(colors)
        self.steps = colors
        self.update()

    def set_bar_padding(self, i):
        self.set_padding = int(i)
        self.update()

    def set_bar_solid_percent(self, f):
        self._bar_solid_percent = float(f)
        self.update()

    def set_background_color(self, color):
        self.set_background_color = QtGui.QColor(color)
        self.update()


class Equalizer_Bars(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Equalizer_Bars, self).__init__(parent)

        self.equalizer = EqualizerBar(
            8,
            ['#00405e', '#3350a1', '#386787','#0088ba','#3396e6', '#00b9d0','#c1f9f9', '#cce2f7'],
            self 
        )

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.equalizer)

        self.set_timer = QtCore.QTimer()
        self.set_timer.setInterval(100)                    
        self.set_timer.timeout.connect(self.update_values)
        self.set_timer.start()

    def update_values(self):
        self.equalizer.size_values([
            min(100, i+random.randint(0, 500) if random.randint(0, 10) > 2 else i)
            for i in self.equalizer.values()
        ])


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Equalizer_Bars()
    w.show()
    sys.exit(app.exec_())

equalizer.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>358</width>
    <height>436</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="1" column="0">
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>Старт</string>
      </property>
     </widget>
    </item>
    <item row="4" column="0">
     <widget class="QPushButton" name="pushButton_3">
      <property name="text">
       <string>PushButton</string>
      </property>
     </widget>
    </item>
    <item row="2" column="0">
     <widget class="QPushButton" name="pushButton_2">
      <property name="text">
       <string>Стор</string>
      </property>
     </widget>
    </item>
    <item row="4" column="1">
     <widget class="QListWidget" name="listWidget">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
      <item>
       <property name="text">
        <string>Песня 1</string>
       </property>
      </item>
      <item>
       <property name="text">
        <string>Песня 2</string>
       </property>
      </item>
      <item>
       <property name="text">
        <string>Песня 3</string>
       </property>
      </item>
      <item>
       <property name="text">
        <string>Песня ...</string>
       </property>
      </item>
     </widget>
    </item>
    <item row="0" column="0">
     <spacer name="verticalSpacer">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>20</width>
        <height>40</height>
       </size>
      </property>
     </spacer>
    </item>
    <item row="0" column="1" rowspan="4">
     <widget class="Equalizer_Bars" name="EqualizerWidget" native="true">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
        <horstretch>1</horstretch>
        <verstretch>1</verstretch>
       </sizepolicy>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>358</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>Equalizer_Bars</class>
   <extends>QWidget</extends>
   <header>equalizer</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка