Reputation: 87
I am trying to change the value of a QWidget from another QWidget, but nothing is happening. I am using this line to call the changeValue function from each Filter object:
self.filter1.valueChanged.connect(self.filter1.changeValue)
I have put the print(value)
statement inside the changeValue method to see if the method is being called, but it is not.
This is my code:
import sys
import numpy as np
import cv2
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtWidgets import (QWidget, QLabel, QHBoxLayout, QVBoxLayout,
QApplication, QPushButton, QSlider,
QFileDialog)
class Filter(QSlider):
"""Common base for all filters"""
defaultK = 3
filterCount = 0
def __init__(self):
super(Filter, self).__init__()
# Variable for the constant of the OpenCV filter
self.k = 3
# Label for the slider
self.k_lbl = QLabel(str(self.k))
# Increase the number of filters created
Filter.filterCount += 1
# Slider for the first OpenCV filter, with min, max, default and step values
self.thresh_sld = QSlider(Qt.Horizontal, self)
self.thresh_sld.setFocusPolicy(Qt.NoFocus)
self.thresh_sld.setMinimum(3)
self.thresh_sld.setMaximum(51)
self.thresh_sld.setValue(self.k)
self.thresh_sld.setSingleStep(2)
def changeValue(self, value):
# Function for setting the value of k1
print(value)
if value % 2 == 1:
self.k = value
else:
self.k = value + 1
self.thresh_sld.setValue(self.k)
self.k_lbl.setText(str(self.k))
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.filter1 = Filter()
self.filter2 = Filter()
# Function sending the slider signal to the processing function
self.filter1.valueChanged.connect(self.filter1.changeValue)
self.filter2.valueChanged.connect(self.filter2.changeValue)
# Creates the main layout (vertical)
v_main_lay = QVBoxLayout()
# Adds the sliders and their labels to the bottom of the main layout
v_main_lay.addWidget(self.filter1.k_lbl)
v_main_lay.addWidget(self.filter1.thresh_sld)
v_main_lay.addWidget(self.filter2.k_lbl)
v_main_lay.addWidget(self.filter2.thresh_sld)
# Sets the main layout
self.setLayout(v_main_lay)
# Sets the geometry, position, window title and window default mode
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('Review')
self.showMaximized()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
Upvotes: 2
Views: 2101
Reputation: 243887
The problem is that you are inheriting from QSlider
and at the same time you are creating within that class an attribute called thresh_sld, and this is the element that is showing in the view, but not connected to changeValue
, the slider that is connected to ChangeValue
is the Filter
class Slider.
Use simple solution is to connect the signal of the attribute thresh_sld
to the slot provided, you must change the following:
self.filter1.valueChanged.connect(self.filter1.changeValue)
self.filter2.valueChanged.connect(self.filter2.changeValue)
to:
self.filter1.thresh_sld.valueChanged.connect(self.filter1.changeValue)
self.filter2.thresh_sld.valueChanged.connect(self.filter2.changeValue)
A more elegant solution is to change the Filter base class from QSlider
to QWidget
, and add the label and QSlider
to its layout.
class Filter(QWidget):
"""Common base for all filters"""
defaultK = 3
filterCount = 0
def __init__(self):
super(Filter, self).__init__()
lay = QVBoxLayout(self)
# Variable for the constant of the OpenCV filter
self.k = 3
# Label for the slider
self.k_lbl = QLabel(str(self.k))
# Increase the number of filters created
Filter.filterCount += 1
# Slider for the first OpenCV filter, with min, max, default and step values
self.thresh_sld = QSlider(Qt.Horizontal, self)
self.thresh_sld.setFocusPolicy(Qt.NoFocus)
self.thresh_sld.setMinimum(3)
self.thresh_sld.setMaximum(51)
self.thresh_sld.setValue(self.k)
self.thresh_sld.setSingleStep(2)
self.thresh_sld.valueChanged.connect(self.changeValue)
lay.addWidget(self.k_lbl)
lay.addWidget(self.thresh_sld)
def changeValue(self, value):
# Function for setting the value of k1
print(value)
if value % 2 == 1:
self.k = value
else:
self.k = value + 1
self.thresh_sld.setValue(self.k)
self.k_lbl.setText(str(self.k))
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.filter1 = Filter()
self.filter2 = Filter()
# Creates the main layout (vertical)
v_main_lay = QVBoxLayout()
# Adds the sliders and their labels to the bottom of the main layout
v_main_lay.addWidget(self.filter1)
v_main_lay.addWidget(self.filter2)
# Sets the main layout
self.setLayout(v_main_lay)
# Sets the geometry, position, window title and window default mode
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('Review')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
Upvotes: 2