Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: PavelVX от Сентябрь 14, 2012, 13:00



Название: Как динамически создать кнопки и события для них?
Отправлено: PavelVX от Сентябрь 14, 2012, 13:00
Возникла задача: в зависимости от ситуации показывать разное количество кнопок с разными действиями на них. Как такое реализовать?
Есть мысль: создать потомка от QPushButton с доп полем, описывающим действие. соединить все подобные кнопки с одним слотом и делать нужное действие. Но SIGNAL(clicked()) не передает, что за кнопка нажата :(.
Посоветуйте, как быть.


Название: Re: Как динамически создать кнопки и события для них?
Отправлено: Bepec от Сентябрь 14, 2012, 13:01
sender() работает в каждом слоте. :)


Название: Re: Как динамически создать кнопки и события для них?
Отправлено: lighting от Сентябрь 14, 2012, 16:23
или используй SignalMapper


Название: Re: Как динамически создать кнопки и события для них?
Отправлено: paul_winex от Сентябрь 16, 2012, 21:33
Я недавно делал так (на питоне):
- определяю новый класс кнопки
- внутри прописываю процедуру выбора нужной процедуры в зависимости от типа
- в самой же кнопке приписываю сигнал на саму себя
выглядит примерно так

Код
Python
class button(QPushButton):
   def __init__(self, type, parent = None):
       QPushButton.__init__(self)
       self.parent = parent
       #set type
       self.type = type
       #type dic
       self.typeText= {1:'type1', 2:'type2',3:'type3'}
       self.typeIcon= {1:'type1.png', 2:'type2.png',3:'type3.png'}
       #connect
       self.clicked.connect(self.doClicked)
       #ui
       self.setupUI()
 
   def setupUI(self):
       '''
       ui type
       '
''
       self.setText(self.typeText[type])
       self.setIcon(self.typeIcon[type])
 
   def doClicked(self):
       '''
       select proc by type
       '
''
       if self.type == 1:
           self.procType1()
       elif self.type == 2:
           self.procType2()
       elif self.type == 3:
           self.procType3()
 
   def procType1(self):
       print '1'
 
   def procType2(self):
       print '2'
 
   def procType3(self):
       print '3'

В процедурах уже может быть ссылка на парента и его процедуры нужные.


Название: Re: Как динамически создать кнопки и события для них?
Отправлено: PavelVX от Сентябрь 17, 2012, 10:12
Спасибо!
Я использовал sender(), все работает как надо.
На данный момент, единственное, что вызывает вопрос: как быстрее всего грохнуть ненужные кнопки из памяти.

Код:
    mainVBoxLayout = new QVBoxLayout();
    QLabel * tstLabel = new QLabel("Тут могла быть ваша реклама :)", this);
    mainVBoxLayout->addWidget(tstLabel);
    advQPushButton * tstBtn;

    for (int i=0; i<10; i++ )
    {
        tstBtn = new QPushButton(QString("tst%1").arg(i), this);
        connect(tstBtn, SIGNAL(clicked()), this, SLOT(clickedReaction()));
        mainVBoxLayout->addWidget(tstBtn);
    }

    QHBoxLayout * bottomHBoxLayout = new QHBoxLayout();
    bottomHBoxLayout->addWidget(btnBack);
    bottomHBoxLayout->addWidget(btnRefresh);
    mainVBoxLayout->addLayout(bottomHBoxLayout);
    setLayout(mainVBoxLayout);

Т.е. при пересоздании mainVBoxLayout старые кнопки так и останутся висеть в памяти, пока я этот вспомогательный виджет не грохну, поскольку у QPushButton не может быть парента - лейаута. На данный момент думаю решить эту проблему через
QList<QPushButton> btnList;
После уничтожения лейаута, уничтожаем кнопки из QList, а потом добавляем заново.
Нет ли более элегантного способа?