Я задавался вопросом, что лучший способ состоит в том, чтобы пойти о следующем сценарии?
Я динамично создаю QSliders, который я хочу связать со связанным QLCDNumber для дисплея. Вещь, я хотел бы иметь десятые части в наличии, таким образом, я хотел бы иметь преобразование между QSLider и QLCDNumber для деления на 10. В этой точке все, что я сохраняю действительно, является QSlider, QLCDNumbers я просто создаю и забыл о. Существует ли простой способ сделать преобразование и соединение, не имея необходимость хранить слишком много информации?
Заранее спасибо.
Это в основном то, что я в итоге использовал; похоже, что это работает (хотя это нарушает всю объектно-ориентированную философию).
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);
}
Я бы попробовал что-то вроде следующего:
// 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)));
После этого вы можете полностью «забыть» о своем ЖК-номере, т.е. вам не нужно держать указатель или ссылку.
EDIT: Решение для нескольких ползунков:
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
.
Я надеюсь, что это поможет.