Динамическое создание в Qt QSlider со связанным QLCDNumber - PullRequest
1 голос
/ 14 июля 2010

Мне было интересно, как лучше поступить по следующему сценарию?

Я динамически создаю QSliders, которые я хочу связать с соответствующим QLCDNumber для отображения.Дело в том, что мне бы хотелось, чтобы были доступны десятые доли, поэтому я хотел бы иметь преобразование между QSLider и QLCDNumber для деления на 10. На данный момент все, что я действительно сохраняю, это QSlider, номера QLCDN, которые я только что создал и забыл.Есть ли простой способ выполнить преобразование и соединение без необходимости хранить слишком много информации?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

Я бы попробовал что-то вроде следующего:

// 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)));

После этого вы можете полностью «забыть» о своем ЖК-номере, т. Е. Вам не нужно сохранять указатель или ссылку.

РЕДАКТИРОВАТЬ: решение для нескольких ползунков:

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.

Надеюсь, это поможет.

0 голосов
/ 14 июля 2010

Это в основном то, что я в конечном итоге использовал; кажется, что это работает (хотя и нарушает всю объектно-ориентированную философию).

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...