2016-07-08 14 views
1

Как я могу вытащить имена моих спинбокс? Я попытался взглянуть на большую часть документации, однако я не мог найти ничего, что могло бы показать имена каждого из дочерних спинбокс. Я попытался изменить результат на строку. Тем не менее, я просто получаю Hex или Long Int, от адреса, который я себе представлял, вместо этого вернулся.Я хочу получить имена моих спинбокс в Qt

enter image description here

QList<QSpinBox*> spinBoxes= findChildren<QSpinBox*>(); 
    //create the QSignalMapper object 
    QSignalMapper* signalMapper= new QSignalMapper(this); 
    //loop through your spinboxes list 
    QSpinBox* spinBox; 
    foreach(spinBox, spinBoxes){ 
     //setup mapping for each spin box 
     connect(spinBox, SIGNAL(valueChanged(int)), signalMapper, SLOT(map())); 
     signalMapper->setMapping(spinBox, spinBox); 
    } 
    //connect the unified mapped(QWidget*) signal to your spinboxWrite slot 
    connect(signalMapper, SIGNAL(mapped(QWidget*)), this, SLOT(spinboxWrite(QWidget*))); 
. 
. 
. 

void GuiTest::SpinBoxChanged(QWidget* wSp){ 
    QSpinBox* sp= (QSpinBox*)wSp;     //now sp is a pointer to the QSpinBox that emitted the valueChanged signal 
    int value = sp->value();      //and value is its value after the change 

    //do whatever you want to do with them here. . . 
    qDebug() << value << "SpinBoxChanged"; 
} 

void GuiTest::spinboxWrite(QWidget* e){ 
    SpinBoxChanged(e); 
    QString* value = (QString*)e; 
    qDebug() << e << value << " SpinBoxWrite"; 

} 

Обратите внимание QDebug() < < х как это, где у меня возникают проблемы при получении информации о spinboxes

+0

Есть ли причина, по которой вы не можете хранить их в качестве переменных-членов? – GraphicsMuncher

+0

Не проще ли дать им имя и использовать его для ссылки? – RvdK

+1

Нет, потому что это означает как-то посмотреть на это имя. 'findChild', карта, хеш и т. д. имеют затраты времени выполнения, вероятно, на порядок больше, чем просто запоминание указателей как переменных-членов. – peppe

ответ

3

Имя, которое вы пытаетесь получить это objectName свойство, каждый QObject и QObject -полученный класс имеет. Вызовите objectName(), чтобы получить это значение.

Вы также можете использовать это с функцией QObject::findChild().

Это должно получить то, что вы хотите:

И будет:

"norm_spinBox_10" SpinBoxWrite

Примечание
Эта линия опасна:

QSpinBox* sp= (QSpinBox*)wSp; 

Используйте qobject_cast вместо отливок в стиле C.

+1

@tisaconundrum Обратите внимание на мое отредактированное предупреждение о стилях C-стиля. –

+1

Также: используя 'qobject_cast' в сочетании с функцией [' sender'] (http://doc.qt.io/qt-5/qobject.html#sender), вы можете избавиться от 'QSignalMapper'. –

0

Там нет прямого пути, чтобы получить имя переменной в виде строки.

Однако, вы можете использовать QMap<QSpinBox*, QString>, чтобы соединить все слова со звездочками.

В конструкторе вы должны назначить их вручную:

map[ui->spinBox] = "spinBox"; 
map[ui->spinBoxWithStrangeName] = "spinBoxWithStrangeName"; 

Тогда вы можете просто получить строки с помощью:

QString name = map[ui->spinBox]; 
0

Просто укажите им имена в файле конструктора, а затем используйте это имя, чтобы получить их в коде на C++.

QSpinBox* mySpinner = findChild<QSpinBox*>("myGivenName");