PyQt5 implementiert den QSlider-Fortschrittsbalken, auf den gezeigt werden soll

Vorwort: Ich habe kürzlich am Player-Teil des Projekts gearbeitet, bin jedoch auf Probleme im Fortschrittsbalken-Teil gestoßen. QSlider selbst unterstützt das Ziehen von Schiebereglern und Klickereignisse, aber das Klickereignis von QSlider besteht nicht darin, dorthin zu springen, wo Sie klicken, sondern zum Anklicken. , erhöht oder verringert einen Schritt entsprechend dem QSLider-Schritt.

Egal auf welche Probleme wir stoßen, wir müssen... es einfach tun, OLG!

Aber das Ideal ist voll und die Realität ist immer beißend

Ich würde es nicht wissen, wenn ich nicht gesucht hätte. Nach der Suche habe ich festgestellt, dass es wirklich wenig Informationen über pyqt5 gibt. Es ist nicht so, dass es keine gibt, aber die meisten davon beziehen sich auf grundlegende und fortgeschrittene Teile. Nun, das ist alles. Hat niemand einen Fortschrittsbalken? Ist Joggen nötig? Oder verwenden nicht viele Leute Python, um GUIs zu erstellen?

Nun, ich habe keine andere Wahl, als die Antwort von Qt zu finden, dem alten Vater von pyqt5.

Nach viel harter Arbeit habe ich mehrere Ergebnisse gefunden. Die Ergebnisse sind wie folgt:

 void mousePressEvent(QMouseEvent *ev)
    {
    
    
        //注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况
        QSlider::mousePressEvent(ev);
        //获取鼠标的位置,这里并不能直接从ev中取值(因为如果是拖动的话,鼠标开始点击的位置没有意义了)
        double pos = ev->pos().x() / (double)width();
        setValue(pos * (maximum() - minimum()) + minimum());
        //向父窗口发送自定义事件event type,这样就可以在父窗口中捕获这个事件进行处理
        QEvent evEvent(static_cast<QEvent::Type>(QEvent::User + 1));
        QCoreApplication::sendEvent(parentWidget(), &evEvent);
    }

Den allgemeinen Ablauf sehen Sie wie folgt:

  • Überschreiben Sie QSlider.mousePressEvent (Mausklickereignis)
  • Rufen Sie das Mausklick-Verarbeitungsereignis der übergeordneten Klasse auf (dies ist erforderlich, da das Ziehen der Schiebeleiste auch ein Mausklickereignis ist und daher die ursprüngliche Schiebefunktion der Schiebeleiste verloren geht).
  • Ermitteln Sie die Mausklickposition und berechnen Sie das Verhältnis der Mausposition auf dem Fortschrittsbalken
  • Aktueller Wert des Fortschrittsbalkens = Verhältnis * Gesamtwert des Fortschrittsbalkens

Jetzt wird es einfacher, auf Python umzusteigen

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            super().mousePressEvent(event)      # 调用父级的单击事件,听说这样能不影响进度条原来的拖动
            val_por = event.pos().x() / self.width()    # 获取鼠标在进度条的相对位置
            self.setValue(int(val_por * self.maximum()))	# 改变进度条的值
            # self.cliecked.emit(self.value())	# 点击发送信号,这里可不要

Hinweis: Kopieren Sie nicht die übergeordnete Klasse, auf die in C++ verwiesen wird, und schreiben Sie sie als QSlider.mousePressEvent(event) und denken Sie nicht, dass die übergeordnete Klasse auf self.parent() verweist. Beides ist falsch. Fragen Sie mich nicht Warum. Ich werde weinen, wenn ich weitermache

おすすめ

転載: blog.csdn.net/qq_45516773/article/details/109527375