2017-05-21 5 views
0

QWidgetの値を別のQWidgetから変更しようとしていますが、何も起こっていません。QWidgetからQSliderの値を変更できません

self.filter1.valueChanged.connect(self.filter1.changeValue) 

私はメソッドが呼び出されているかどうかを確認するためにchangeValueメソッド内print(value)文を入れているが、そうではありません:私は、各フィルターオブジェクトから関数ChangeValueを呼び出すために、このラインを使用しています。

これは私のコードです:

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_()) 

答えて

1

問題は、あなたがQSliderから継承されていると同時に、あなたはそのクラス内thresh_sldという属性を作成しているということであり、これはで表示されている要素であり、ビューは、changeValueに接続されていない、ChangeValueに接続されているスライダーは、Filterクラスのスライダーです。

使用シンプルなソリューションを提供するスロットに属性thresh_sldの信号を接続することで、次のように変更する必要があります。

self.filter1.valueChanged.connect(self.filter1.changeValue) 
self.filter2.valueChanged.connect(self.filter2.changeValue) 

へ:

self.filter1.thresh_sld.valueChanged.connect(self.filter1.changeValue) 
self.filter2.thresh_sld.valueChanged.connect(self.filter2.changeValue) 

よりエレガントな解決策を変更することですFilter基本クラスをQSliderからQWidgetに変更し、ラベルにQSliderを追加します。

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_()) 
+0

ありがとうございました!これは確かに問題でした。そして、レイアウト構成のヒントをいただきありがとうございました。 – Rafael

関連する問題