QSlider Qt中的动态创建及相关的QLCDNumber

时间:2010-07-14 13:18:06

标签: c++ qt qt4

我想知道下列情况的最佳方法是什么?

我正在动态创建QSliders,我希望链接到相关的QLCDNumber以供显示。问题是我希望有十分之一可用,所以我希望在QSLider和QLCDNumber之间进行转换除以10.此时我真正保留的是QSlider,我刚刚创建和忘记的QLCDNumbers。是否有一种简单的方法可以进行转换和连接而无需保留太多信息?

提前致谢。

2 个答案:

答案 0 :(得分:2)

我会尝试以下几点:

// create a new signal in your parent widget
signals:
  void updateLCDNumber(double);

// and a slot which performs the conversion
private slots:
  void performConversion(int value)
  {
   double convertedValue = value * 0.1;
   emit(updateLCDNumber(convertedValue));
  }

// then set the signals/slots up like this
connect(mySlider, SIGNAL(valueChanged(int)), this, SLOT(performConversion(int)));
connect(this, SIGNAL(updateLCDNumber(double)), myLCDNumber, SLOT(display(double)));

之后您可以完全“忘记”您的LCD编号,即您不需要保留指针或参考。

编辑:几个滑块的解决方案:

class MySlider : public QSlider
{
 Q_OBJECT
public:
 MySlider(QWidget *parent=0) : QSlider(parent)
 {
   connect(this, SIGNAL(valueChanged(int)), this, SLOT(performConversion(int)));
 }

signals:
  void updateLCDNumber(double);

private slots:
   void performConversion(int value)
   {
     double convertedValue = value * 0.1;
     emit(updateLCDNumber(convertedValue));
   } 
};

现在创建MySlider个实例而不是QSlider个实例并连接您的QLCDNumbers

connect(mySlider1, SIGNAL(updateLCDNumber(double)), myLCDNumber1, SLOT(display(double)));
connect(mySlider2, SIGNAL(updateLCDNumber(double)), myLCDNumber2, SLOT(display(double)));
...

这样您还可以实现不同的转换因子等,只需修改MySlider实现。

我希望有所帮助。

答案 1 :(得分:0)

这基本上是我最终使用的;它似乎有效(虽然它违反了整个面向对象的哲学)。

signalMapper= new QSignalMapper(this);
QObject::connect(tmpSlider, SIGNAL(valueChanged(int)), signalMapper, SLOT(map()));
sliderMapper->setMapping(tmpSLider, tmpLCDNumber);
QObject::connect(signalMapper, SIGNAL(mapped(QWidget*)), this, SLOT(updateLCD(QWidget*)))

...

void MyClass::updateLCD(QWidget* lcdNum){
    ((QLCDNumber*)lcdNum)->display(((QSlider*)(signalMapper->mapping(lcdNum)))->value()*.1);
}