2013-12-15 5 views
1

Я создал графический интерфейс с использованием Qt Designer, у меня есть 20 или более виджетов lineEdit, я ищу правильный способ получить доступ ко всем из них, не имея доступа к каждому из них ... Я объясню пример в псевдокоде:Доступ к нескольким виджетам

Это то, что я НЕ хочу:

lineEdit1.setText("Value = 1") 
lineEdit2.setText("Value = 2") 
lineEdit3.setText("Value = 3") 
and so on, up to 
lineEdit20.setText("Value = 20") 

Я ищу что-то вроде этого:

for i in xrange(1,21): 

    lineEdit(i).setText("Value = whatever") 

проблема заключается в том, что, насколько я знаю, когда перетаскивание g, Qt Designer автоматически добавляет номер в конец имени ... lineEdit1, lineEdit2, .... поэтому после этого я не знаю, как получить доступ ко всем из них в коде.

ответ

0

Если вы действительно хотите использовать конструктор QT, я думаю, ваше лучшее решение - просто добавить виджеты в список. Я знаю, что это неоптимально, но таким образом вам нужно будет сделать это только один раз.

lineEditL = [] 
lineEditL.append(lineEdit1) 
lineEditL.append(lineEdit2) 

Другое решение - просто перебрать детей. Это объясняется here, нет причин повторять.

2

Во-первых, вам не обязательно принимать имя, которое автоматически назначается в Qt Designer. Просто установите свойство objectName на все, что наиболее подходит.

Чтобы перебрать группы виджетов, доступно несколько методов QObject.

Наиболее мощным является findChildren, который может искать рекурсивно для объектов/виджетов на основе их класса:

for child in self.findChildren(QtGui.QLineEdit): 
    child.setValue(value) 

, а также их Objectname:

rgx = QtCore.QRegExp('lineEdit[0-9]+') 
for child in self.findChildren(QtGui.QLineEdit, rgx): 
    child.setValue(value) 

Но более простой метод будет использовать Qt Дизайнер, чтобы поместить все виджеты внутри виджета контейнера (например, QWidget, QFrame, QGroupBox и т. Д.), А затем использовать нерекурсивный метод children для их перебора:

for index, child in enumerate(self.groupBox.children()): 
    child.setValue(value[index]) 

Вы также можете рассмотреть возможность использования QFormLayout, который обеспечивает более структурированный способ делать что-то. Это доступно в Qt Designer: просто перетащите Form Layout в свою основную форму и затем используйте Add form layout row в меню правой кнопки мыши, чтобы добавить в него виджеты.

+0

Спасибо! Я не знал этих вещей findChildren и т. Д., Похоже, это то, что я ищу. Еще раз спасибо за ваш ответ, я попробую с ним. – codeKiller

0
QWidget *pWin = QApplication::activeWindow(); 
for(int i=1; i<=21; i++) { 
    QString strName ="LineEdit"+QString::number(i); 
    QLineEdit *le = pWin->findChild<QLineEdit *>(strName); 
    if(le) le->setText("Value = "+Qstring::number(i)); 
} 
+4

Пожалуйста, добавьте пояснения к вашему коду. – Mark

Смежные вопросы