Russian Qt Forum
Ноябрь 22, 2024, 23:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как динамически создать кнопки и события для них?  (Прочитано 3214 раз)
PavelVX
Гость
« : Сентябрь 14, 2012, 13:00 »

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

sender() работает в каждом слоте. Улыбающийся
Записан
lighting
Гость
« Ответ #2 : Сентябрь 14, 2012, 16:23 »

или используй SignalMapper
Записан
paul_winex
Гость
« Ответ #3 : Сентябрь 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'

В процедурах уже может быть ссылка на парента и его процедуры нужные.
Записан
PavelVX
Гость
« Ответ #4 : Сентябрь 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, а потом добавляем заново.
Нет ли более элегантного способа?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 21.