Python 3.x 如何反转QSlider元素的标签以及如何使其可单击?
我在GUI中插入了一个QSlider元素,并手动添加了一些标签。然而,我没有设法颠倒标签的顺序,即从0-5改为5-0。此外,我无法实现“单击”值的方法。这个问题是前几天另一个问题的延伸() 我在QSlider文档中查找选项,并尝试更改create_slider函数中的for循环。我不明白为什么这不起作用,但也许它太琐碎了。至于尝试使滑块可点击,我已经看到了一些解决方案,但在我的示例中,我没有设法使它们工作Python 3.x 如何反转QSlider元素的标签以及如何使其可单击?,python-3.x,user-interface,slider,pyqt5,Python 3.x,User Interface,Slider,Pyqt5,我在GUI中插入了一个QSlider元素,并手动添加了一些标签。然而,我没有设法颠倒标签的顺序,即从0-5改为5-0。此外,我无法实现“单击”值的方法。这个问题是前几天另一个问题的延伸() 我在QSlider文档中查找选项,并尝试更改create_slider函数中的for循环。我不明白为什么这不起作用,但也许它太琐碎了。至于尝试使滑块可点击,我已经看到了一些解决方案,但在我的示例中,我没有设法使它们工作 导入操作系统 从PyQt5导入QtCore、QtGui、QtWidgets 类应用程序(Q
导入操作系统
从PyQt5导入QtCore、QtGui、QtWidgets
类应用程序(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setGeometry(50、50、400、500)
self.initUI()
def initUI(self):
self.m_按钮=[]
self.s_标签=[]
group=qtwidts.QButtonGroup(self)
left_button=qtwidts.QPushButton(“left”,checkable=True)
左按钮。设置固定大小(100,30)
右按钮=QtWidgets.QPushButton(“右”,可检查=True)
右按钮。设置固定大小(100,30)
group.addButton(左按钮)
group.addButton(右按钮)
group.Button单击[QtWidgets.QAbstractButton].connect(self.update\u text)
label1=qtwidts.QLabel(“Test1:”)
label2=qtwidts.QLabel(“Test2:”)
self.m_widget=qtwidts.QWidget()
self.create_按钮()
左键。单击()
self.s_widget=qtwidts.QWidget()
self.create_滑块()
开始按钮=qtwidts.QPushButton(“继续”)
开始按钮。设置固定大小(100,50)
check_button=qtwidts.QPushButton(“检查\n记录”)
检查按钮。设置固定尺寸(120,50)
##从GUI的布局开始------------------------------
central_widget=qtwidts.QWidget()
self.setCentralWidget(中心窗口小部件)
lay_tot=qtwidts.QVBoxLayout(中心小部件)
h1lay=qtwidts.QHBoxLayout()
h1lay.addStretch(1)
h1lay.addWidget(左按钮)
h1lay.addWidget(右按钮)
h1lay.addStretch(5)
总布置图(H1布置图)
h2lay=qtwidts.QHBoxLayout()
h2lay.addStretch(1)
h2lay.addWidget(标签1)
h2lay.addStretch(2)
h2lay.addWidget(label2)
h2lay.addStretch(1)
铺设至添加拉伸(1)
总布置图(H2布置图)
#插入水平第三层(触点+滑块)
h3lay=qtwidts.QHBoxLayout()
h3lay.addStretch(1)
h3lay.addWidget(self.m_小部件,alignment=QtCore.Qt.AlignCenter)
h3lay.addStretch(2)
h3lay.addWidget(self.s_小部件,alignment=QtCore.Qt.AlignCenter)
h3lay.addStretch(3)
总布置图(H3层)
h4lay=qtwidts.QHBoxLayout()
h4lay.addStretch(5)
h4lay.addWidget(检查按钮,2.4)
h4lay.addWidget(启动按钮,2.4)
h4lay.addStretch(1)
铺设至添加拉伸(2)
总布置图(h4lay)
def创建按钮(自):
坐标=[
(4, 1),
(3, 0),
(3, 1),
(3, 2),
(2, 0),
(2, 1),
(2, 2),
(0, 1),
]
group=QtWidgets.QButtonGroup(exclusive=True)
grid=qtwidts.QGridLayout(self.m_小部件)
对于协调中的协调:
btn=QtWidgets.QPushButton(可检查=True)
btn.setAutoExclusive(真)
btn.setFixedSize(70,50)
grid.addWidget(btn,*coord)
group.addButton(btn)
self.m_按钮.附加(btn)
self.m_widget.setFixedSize(self.m_widget.sizeHint())
@pyqtSlot(qtwidts.QAbstractButton)
def更新_文本(自身,btn):
text=btn.text()
文本={
“左”:[“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”],
“权利”:[“9”、“10”、“11”、“12”、“13”、“14”、“15”、“16”],
}
如果文本中包含文本:
对于btn,zip中的txt(self.m_按钮,文本[text]):
btn.setText(txt)
def create_滑块(自):
#创建用于设置振幅的滑块
hlay\u slide=qtwidts.QHBoxLayout(self.s\u小部件)
slider=qtwidts.QSlider(QtCore.Qt.Vertical)
slider.setTickPosition(qtwidts.QSlider.TicksLeft)
滑块。设置滴答声间隔(1)
滑块。设置单步(.5)
滑块。设置范围(0,5)
vlay_slide=qtwidts.QVBoxLayout()
对于idx,枚举中的val(范围(6,0,-1)):
lblSlider=qtwidts.QLabel(str(idx))
vlay_slide.addWidget(lblSlider)
hlay_幻灯片。添加布局(vlay_幻灯片)
hlay_slide.addWidget(滑块)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=App()
w、 show()
sys.exit(app.exec_())
试试看:
#import os
from PyQt5 import QtCore, QtGui, QtWidgets
class Slider(QtWidgets.QSlider): # + <-----
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
val = self.pixelPosToRangeValue(event.pos())
self.setValue(val)
super(Slider, self).mousePressEvent(event)
def pixelPosToRangeValue(self, pos):
opt = QtWidgets.QStyleOptionSlider()
self.initStyleOption(opt)
gr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderGroove, self)
sr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderHandle, self)
if self.orientation() == QtCore.Qt.Horizontal:
sliderLength = sr.width()
sliderMin = gr.x()
sliderMax = gr.right() - sliderLength + 1
else:
sliderLength = sr.height()
sliderMin = gr.y()
sliderMax = gr.bottom() - sliderLength + 1;
pr = pos - sr.center() + sr.topLeft()
p = pr.x() if self.orientation() == QtCore.Qt.Horizontal else pr.y()
return QtWidgets.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - sliderMin,
sliderMax - sliderMin, opt.upsideDown)
class App(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setGeometry(50, 50, 400, 500)
self.initUI()
def initUI(self):
self.m_buttons = []
self.s_labels = []
group = QtWidgets.QButtonGroup(self)
left_button = QtWidgets.QPushButton("Left", checkable=True)
left_button.setFixedSize(100, 30)
right_button = QtWidgets.QPushButton("Right", checkable=True)
right_button.setFixedSize(100, 30)
group.addButton(left_button)
group.addButton(right_button)
group.buttonClicked[QtWidgets.QAbstractButton].connect(self.update_text)
label1 = QtWidgets.QLabel("Test1:")
label2 = QtWidgets.QLabel("Test2:")
self.m_widget = QtWidgets.QWidget()
self.create_buttons()
left_button.click()
self.s_widget = QtWidgets.QWidget()
self.create_slider()
start_button = QtWidgets.QPushButton("Continue")
start_button.setFixedSize(100, 50)
check_button = QtWidgets.QPushButton("Check \nrecordings")
check_button.setFixedSize(120, 50)
## start with the layout of the GUI ------------------------------
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
lay_tot = QtWidgets.QVBoxLayout(central_widget)
h1lay = QtWidgets.QHBoxLayout()
h1lay.addStretch(1)
h1lay.addWidget(left_button)
h1lay.addWidget(right_button)
h1lay.addStretch(5)
lay_tot.addLayout(h1lay)
h2lay = QtWidgets.QHBoxLayout()
h2lay.addStretch(1)
h2lay.addWidget(label1)
h2lay.addStretch(2)
h2lay.addWidget(label2)
h2lay.addStretch(1)
lay_tot.addStretch(1)
lay_tot.addLayout(h2lay)
# insert the horizontal third layer (contacts + slider)
h3lay = QtWidgets.QHBoxLayout()
h3lay.addStretch(1)
h3lay.addWidget(self.m_widget, alignment=QtCore.Qt.AlignCenter)
h3lay.addStretch(2)
h3lay.addWidget(self.s_widget, alignment=QtCore.Qt.AlignCenter)
h3lay.addStretch(3)
lay_tot.addLayout(h3lay)
h4lay = QtWidgets.QHBoxLayout()
h4lay.addStretch(5)
h4lay.addWidget(check_button,2.4)
h4lay.addWidget(start_button,2.4)
h4lay.addStretch(1)
lay_tot.addStretch(2)
lay_tot.addLayout(h4lay)
def create_buttons(self):
coords = [
(4, 1),
(3, 0),
(3, 1),
(3, 2),
(2, 0),
(2, 1),
(2, 2),
(0, 1),
]
group = QtWidgets.QButtonGroup(exclusive=True)
grid = QtWidgets.QGridLayout(self.m_widget)
for coord in coords:
btn = QtWidgets.QPushButton(checkable=True)
btn.setAutoExclusive(True)
btn.setFixedSize(70, 50)
grid.addWidget(btn, *coord)
group.addButton(btn)
self.m_buttons.append(btn)
self.m_widget.setFixedSize(self.m_widget.sizeHint())
@QtCore.pyqtSlot(QtWidgets.QAbstractButton)
def update_text(self, btn):
text = btn.text()
texts = {
"Left": ["1", "2", "3", "4", "5", "6", "7", "8"],
"Right": ["9", "10", "11", "12", "13", "14", "15", "16"],
}
if text in texts:
for btn, txt in zip(self.m_buttons, texts[text]):
btn.setText(txt)
def create_slider(self):
# create the slider for the setting of amplitude
# - self.slider = QtWidgets.QSlider(QtCore.Qt.Vertical)
self.slider = Slider(QtCore.Qt.Vertical) # +++
self.slider.setTickPosition(QtWidgets.QSlider.TicksLeft)
self.slider.setTickInterval(1)
# setSingleStep(int)
# ? self.slider.setSingleStep(0.5)
self.slider.setRange(0, 5)
self.slider.valueChanged.connect(self.valueChangedSlider)
vlay_slide = QtWidgets.QVBoxLayout()
# - for idx, val in enumerate(range(6, 0, -1)):
for idx in range(5, -1, -1): # +++
lblSlider = QtWidgets.QLabel(str(idx))
vlay_slide.addWidget(lblSlider)
hlay_slide = QtWidgets.QHBoxLayout(self.s_widget)
hlay_slide.addLayout(vlay_slide)
hlay_slide.addWidget(self.slider)
#+++
def valueChangedSlider(self, value):
print("value-> {}".format(value))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = App()
w.show()
sys.exit(app.exec_())
试试看:
#import os
from PyQt5 import QtCore, QtGui, QtWidgets
class Slider(QtWidgets.QSlider): # + <-----
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
val = self.pixelPosToRangeValue(event.pos())
self.setValue(val)
super(Slider, self).mousePressEvent(event)
def pixelPosToRangeValue(self, pos):
opt = QtWidgets.QStyleOptionSlider()
self.initStyleOption(opt)
gr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderGroove, self)
sr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderHandle, self)
if self.orientation() == QtCore.Qt.Horizontal:
sliderLength = sr.width()
sliderMin = gr.x()
sliderMax = gr.right() - sliderLength + 1
else:
sliderLength = sr.height()
sliderMin = gr.y()
sliderMax = gr.bottom() - sliderLength + 1;
pr = pos - sr.center() + sr.topLeft()
p = pr.x() if self.orientation() == QtCore.Qt.Horizontal else pr.y()
return QtWidgets.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - sliderMin,
sliderMax - sliderMin, opt.upsideDown)
class App(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setGeometry(50, 50, 400, 500)
self.initUI()
def initUI(self):
self.m_buttons = []
self.s_labels = []
group = QtWidgets.QButtonGroup(self)
left_button = QtWidgets.QPushButton("Left", checkable=True)
left_button.setFixedSize(100, 30)
right_button = QtWidgets.QPushButton("Right", checkable=True)
right_button.setFixedSize(100, 30)
group.addButton(left_button)
group.addButton(right_button)
group.buttonClicked[QtWidgets.QAbstractButton].connect(self.update_text)
label1 = QtWidgets.QLabel("Test1:")
label2 = QtWidgets.QLabel("Test2:")
self.m_widget = QtWidgets.QWidget()
self.create_buttons()
left_button.click()
self.s_widget = QtWidgets.QWidget()
self.create_slider()
start_button = QtWidgets.QPushButton("Continue")
start_button.setFixedSize(100, 50)
check_button = QtWidgets.QPushButton("Check \nrecordings")
check_button.setFixedSize(120, 50)
## start with the layout of the GUI ------------------------------
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
lay_tot = QtWidgets.QVBoxLayout(central_widget)
h1lay = QtWidgets.QHBoxLayout()
h1lay.addStretch(1)
h1lay.addWidget(left_button)
h1lay.addWidget(right_button)
h1lay.addStretch(5)
lay_tot.addLayout(h1lay)
h2lay = QtWidgets.QHBoxLayout()
h2lay.addStretch(1)
h2lay.addWidget(label1)
h2lay.addStretch(2)
h2lay.addWidget(label2)
h2lay.addStretch(1)
lay_tot.addStretch(1)
lay_tot.addLayout(h2lay)
# insert the horizontal third layer (contacts + slider)
h3lay = QtWidgets.QHBoxLayout()
h3lay.addStretch(1)
h3lay.addWidget(self.m_widget, alignment=QtCore.Qt.AlignCenter)
h3lay.addStretch(2)
h3lay.addWidget(self.s_widget, alignment=QtCore.Qt.AlignCenter)
h3lay.addStretch(3)
lay_tot.addLayout(h3lay)
h4lay = QtWidgets.QHBoxLayout()
h4lay.addStretch(5)
h4lay.addWidget(check_button,2.4)
h4lay.addWidget(start_button,2.4)
h4lay.addStretch(1)
lay_tot.addStretch(2)
lay_tot.addLayout(h4lay)
def create_buttons(self):
coords = [
(4, 1),
(3, 0),
(3, 1),
(3, 2),
(2, 0),
(2, 1),
(2, 2),
(0, 1),
]
group = QtWidgets.QButtonGroup(exclusive=True)
grid = QtWidgets.QGridLayout(self.m_widget)
for coord in coords:
btn = QtWidgets.QPushButton(checkable=True)
btn.setAutoExclusive(True)
btn.setFixedSize(70, 50)
grid.addWidget(btn, *coord)
group.addButton(btn)
self.m_buttons.append(btn)
self.m_widget.setFixedSize(self.m_widget.sizeHint())
@QtCore.pyqtSlot(QtWidgets.QAbstractButton)
def update_text(self, btn):
text = btn.text()
texts = {
"Left": ["1", "2", "3", "4", "5", "6", "7", "8"],
"Right": ["9", "10", "11", "12", "13", "14", "15", "16"],
}
if text in texts:
for btn, txt in zip(self.m_buttons, texts[text]):
btn.setText(txt)
def create_slider(self):
# create the slider for the setting of amplitude
# - self.slider = QtWidgets.QSlider(QtCore.Qt.Vertical)
self.slider = Slider(QtCore.Qt.Vertical) # +++
self.slider.setTickPosition(QtWidgets.QSlider.TicksLeft)
self.slider.setTickInterval(1)
# setSingleStep(int)
# ? self.slider.setSingleStep(0.5)
self.slider.setRange(0, 5)
self.slider.valueChanged.connect(self.valueChangedSlider)
vlay_slide = QtWidgets.QVBoxLayout()
# - for idx, val in enumerate(range(6, 0, -1)):
for idx in range(5, -1, -1): # +++
lblSlider = QtWidgets.QLabel(str(idx))
vlay_slide.addWidget(lblSlider)
hlay_slide = QtWidgets.QHBoxLayout(self.s_widget)
hlay_slide.addLayout(vlay_slide)
hlay_slide.addWidget(self.slider)
#+++
def valueChangedSlider(self, value):
print("value-> {}".format(value))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = App()
w.show()
sys.exit(app.exec_())
首先感谢您提供的代码。在过去的几天里,我一直在努力了解它是如何工作的。但有一件事我搞不清楚。如何使用文本1:8/9:16返回第二个按钮组的值。我试图通过group.buttonClicked[…]获取它。连接,但不起作用。事实上,按下按钮时什么也不会发生。有人能告诉我如何设置它或者问题出在哪里吗?@umrpedrod我添加了一个例子,试试看。首先感谢你的代码。在过去的几天里,我一直在努力了解它是如何工作的。但有一件事我搞不清楚。如何使用文本1:8/9:16返回第二个按钮组的值。我试图通过group.buttonClicked[…]获取它。连接,但不起作用。事实上,按下按钮时什么也不会发生。有人能给我一个提示如何设置它或问题在哪里