PyQt5 QSliderın boyutunu ayarlama

PyQt5 te bir tane yatay QSliderım var bunun boyutunu sl.resize(100,100) gibi değiştirdiğim zaman sadece mavi sürüklediğim şey büyüyor ben arkadaki barın da büyümesini istiyorum. İnternette biraz araştırdım ve bununla ilgili şeyler buldum fakat bunlar arkadaki barın rengini de değiştiriyor ben aynı temada olup büyümesini istiyorum.
Kullandığım yöntem

        self.mindelayclicki.setStyleSheet("""
            QSlider::groove:horizontal {
                height: 30px;
                background-color:gray;
                margin: 0 10px;
            }
            QSlider::handle:horizontal {
                height:20px;
                width: 10px;
                background-color: blue;
            }

                """)

çıktı
image

pyqt5 ile ilgili hiç birşey bilmiyorum o yüzden anlamadım. arkadaki bar dediğin gri olan kısım mı?

Evet (20 karakterrrr)

image
Alttaki varsayılan alttakindeki barı büyütmek istiyorum.Üstteki internetten bulduğum kodla yapabildiğim.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QSlider
from PyQt5.QtCore import Qt

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        mySlider = QSlider(Qt.Horizontal, self)
        mySlider.setGeometry(30, 40, 300, 30)
        mySlider.valueChanged[int].connect(self.changeValue)

        self.setGeometry(50,50,320,200)
        self.setWindowTitle("Checkbox Example")
        self.show()

    def changeValue(self, value):
        print(value)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
mySlider.setGeometry(30, 40, 300, 30)

300 değerini istediğin gib artırarak x ekseninde boyunu değiştirebilirsiniz.

QSlider - Python Tutorial (pythonbasics.org)

Ben de internetten bulduğum kodla denedim.

Değer 300 iken:

image

Değer 100 iken:

image

Barın kalınlığını değiştirmek istiyorum uzunluğunu değil.Ama yukarda anlatamamışım sizde haklısınız

Yok ben anlamamışım. Sorabilirdim, büyütmekten kastınız nedir uzatmak mı yoksa kalınlığını artırmak mı diye. Yada resimden çıkarabilirdim belki ama emin olamadım açıkçası sormadım da nasıl olsa düzeltilir yanlış anlaşılan bir kısım varsa.

Alttaki barın adı groove, yani oluk diye Türkçeye çevirebiliriz.

Bu custom bir özellik olarak değiştirildiğinde sistem renklerini kullanmıyor. Doğal olarak arka fon sistem renklerini siz ayarlamak zorunda kalacaksınız.

Burada mavi sürgüye handle/ yani kulp deniliyor muş. Arka plan rengini,

background: palette(highlight);

İle istediğimiz maviye yaklaştırabiliyoruz.

İlk oluk/groove oldukça ince içindeki renk görünmüyor.

Tahmini bir renk kullanılarak geçici olarak verdik.

Burada;

.setFixedSize(QSize(400,50))

Değerleri ile oynayarak biraz handle/kulbu büyütme küçültme şansınız da var.

İlave bir iki özellik olarak, sürüklendiği noktada rengi değiştiren bir kısım da var. Bunları çıkarabilir yada rengini de değiştirebilirsiniz.

from PyQt5.QtCore import Qt, QSize
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QSlider

QSS = """
QSlider::groove:horizontal {
    border: 1px solid;
    height: 30px;
    /*margin: 30px;*/
    background-color: rgb(238, 238, 238);
    /*position: absolute;*/
    left: 20px; right: 20px;
    }
QSlider::handle:horizontal {
    background: palette(highlight); 
    height: 40px;
    width: 10px;
    
    margin: -15px -20px;
    }
QSlider::handle:horizontal:pressed {
    background-color: black;
}
QSlider::add-page:horizontal {
    background: rgb(183, 183, 183);
}

QSlider::sub-page:horizontal {
    background: rgb(80, 80, 232);
}

"""

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):
        self.setWindowTitle('slider sample')

        self.slider_1 = QSlider()
        self.slider_1.setFixedSize(QSize(400,50))
        self.slider_1.setOrientation(Qt.Orientation.Horizontal)

        self.slider_2 = QSlider()
        self.slider_2.setFixedSize(QSize(400,200))
        self.slider_2.setOrientation(Qt.Orientation.Horizontal)
        self.slider_2.setStyleSheet(QSS)

        layout = QVBoxLayout()
        layout.addWidget(self.slider_1)
        layout.addWidget(self.slider_2)

        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication([])
    ex =Window()
    ex.show()
    app.exec()

Kodun tamamı yukarıda. Özetle custom bir iş yaptığımız için tema renklerini kendimiz belirlememiz gerekiyor, daha uzunca bir yolu da var ama girmek istemezsiniz. Pyqt içerisinde QSlider’ın groove varsayılan değerini manipüle etmek ki bu durumda bütün programlarınızda artık bu yeni değeri kullanır, varsayılan ayarlarını değiştirmemek taraftarıyım.

QSlider::add-page:horizontal {
    background: rgb(183, 183, 183);
}

Bu kısımda ayarlayacağınız renk oluk ileri yöndeki gri rengi vermekte.

QSlider::sub-page:horizontal {
    background: rgb(80, 80, 232);
}

Yukarıdaki kısım ise handle/kulp kaydırıldığında geride kalan kısmın rengini ayarlamakta. Farklı bir mavi olarak bıraktım. Siz isterseniz. Her iki renk değerini aynı yapabilirsiniz. Bu şekilde biraz progress bar gibi de çalışabildiği görünmesi açısından bıraktım.

image

Kodu şu kaynaktan biraz değiştirerek düzenledim:

【PyQt6】【サンプル】QSlider(ハンドルが丸いスライダー) - パソコン関連もろもろ (hatenablog.com)

Orijinal koda da bakmak isterseniz.

(ハンドルが丸いスライダー)

Yuvarlak saplı sürgü demiş benim japon kardeşlerim.

Onu nasıl yaparım bir link falan atabilirmisiniz varsa

Onu yapabileceğinizden emin değilim.

Ama denemek isterseniz.

PyQt/QssQSlider.py at master · PyQt5/PyQt (github.com)

QSlider:horizontal {
    min-height: 60px;
}
QSlider::groove:horizontal {
    height: 1px;
    background: white; 
}
QSlider::handle:horizontal {
    width: 30px;
    margin-top: -15px;
    margin-bottom: -15px;
    border-radius: 15px;
    background: qradialgradient(spread:reflect, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0.6 rgba(210, 210, 210, 255), stop:0.7 rgba(210, 210, 210, 100));
}
QSlider::handle:horizontal:hover {
    background: qradialgradient(spread:reflect, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0.6 rgba(255, 255, 255, 255), stop:0.7 rgba(255, 255, 255, 100));
}

Değerler burada, oynayıp modülü yeniden derleyip kurabilir misiniz emin olamadım.

Ha işim gücüm yok bununla uğraşırım derseniz siz bilirsiniz.

Bu varsayılan değerler değil sanırım ama neyse işimi halletim grove ile olan kısmı ama öndeki çubuğun bir ucunu nasıl üçgen yaparım.
image
Alttaki kaydırıcı gibi kullandığım kod bu

            QSlider::groove:horizontal {
                height: 8px;
                margin: 0px;
                background-color: #E7EAEA;
                border:1px solid #D6D6D6;
            }
            QSlider::handle:horizontal {
                height: 20px;
                width: 12px;
                margin: -15px 0px -15px 0px;
                background-color: #007AD9;
            }
from PyQt5.QtWidgets import QApplication, QWidget, QSlider
from PyQt5.QtCore import Qt
import sys
 
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(300, 250)
        self.setWindowTitle("CodersLegacy")
 
        slider = QSlider(Qt.Orientation.Horizontal, self)
        slider.setGeometry(50,50, 200, 50)
        slider.setMinimum(0)
        slider.setMaximum(20)
        slider.setTickPosition(QSlider.TickPosition.TicksBelow)
        slider.setTickInterval(2)
 
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())

Bunu biliyorum ama ben css de ekleme yaptığım için olmuyor bu

3 kişinin kullandığı teknolojiyi kullanınca kaynak bulmak sorun oluyor :joy:


Qt nin kendi sitesi diyor

3 kişi derken ölesine dedim tabi 3 kişi değil. Kaynak bulması sorun olduğu için. Şöyle bi örnek vereyim. mesela kotlin android için yapılmış bir dil olduğu için sınırsız kaynak var. ama tkinter kivy qt bunlar kütüphane olduğu için yeterli kaynak olmayabiliyor. şahsi görüşüm. Güncel teknolojiler kullanıp çözüme hemen ulaşmak varken, neden boşa zaman kaybedelim? İstediğin şeyler belki hiç olmayabilir…

Haklı olduğunuz yanlar var, lakin katılmadığım yönlerde var.

Söz konusu olan QT kütüphanesi ise QT linux için arayüz oluşturmak üzere C/C++ dilinde yazılmış çok güçlü bir ara yüz kütüphanesi. Dökümantasyonu da gayet iyi herhangi bir sıkıntısı yok.

Sorun şurada;

Python aslında bir qt kütüphanesi sunmuyor, qt dll’lerine bir arayüz sarmalıyor. Ve bunu pyqt üzerinden yapıyor. Bu durumda, pyqt tüm kütüphaneyi sarmalamamış olabiliyor. Yani bazı kod parçaları dll içerisinde çağırılabilecek durumda iken pyqt henüz bunun karşılığını kodlamamış olabiliyor.

Ki burada sorun bu değil.

Custom kontrol tasarımı isteniyor. Yani bir slider’ın groove’unun boyutunu oynama ihtiyacı duyan olmamış olabiliyor, yada siz slider’ı tick ve şekli farklı bir handle istediğinizde hepsini kendiniz yeniden yazmanız gerekiyor.

Yani bunun bir örneği, üçgen buton, yıldız şeklinde ana pencere istiyorum gibi istek olabilir.

Bunlar standart olarak ön görülmez ve bir properties olarak hazır tutulmaz. Gerektiğinde bir widget sınıfından, yada slider sınıfından yeninde türetilerek oluşturulması gerekir.

Aslında karışık bir durum yok.

handle a bir icon.png dosyası atayarak slider’ın şekli istediğimiz şekilde yeniden tanımlanabiliyor.

Aynı şekilde bütün nitelikleri ezilerek yeniden yazılabiliyor. Ama bu oluşturulan, standart bir kontrol olmaktan çıkıp custom kontrol haline geliyor.

Bunu qt kütüphanesinde nasıl sarmalandığını görsün diye link verdim aldığım cevap:

Kendi halledebiliyormuş, dinlemiyor bildiği gibi devam ediyor ben de düzeltimiş kod eklemedim.

Yani sizin anlayacağınız, dokümantasyon sorunu yok, çözülemeyecek bir sorun yok, ama ben kendim hallettim deyip dümdüz devam edince, geri kalanını da kendi halleder diye kendi haline bıraktım.

Size anlatırken yine ipuçlarını verdim ama kod paylaşmayı düşünmüyorum.

Onu hallettim deyip geçecek nasıl olsa kodu versem.

Halletsin.

Ama söylediğim gibi qt gayet sağlam bir linux arayüz kütüphanesidir kütüphanede bir sorun yok. Sadece, python için biraz interface eklemek gerekiyor ki o da alacaklı gibi, o olmadı, bunu beğenmedim, bu işe yaramaz, ben bunu istiyorum gibi dümdüz müşteri muamelesi yapılınca çok ilerletmek istemedim.

Dediğiniz şeyler üzerine uğraştım fakat htmlde stylesheet olarak eklediğim kod çalışıyor aynı kodu pyqt stylesheet ekliyorum olmuyor