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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическое создание QPushButton  (Прочитано 5978 раз)
interv
Гость
« : Январь 20, 2012, 10:08 »

Код
C
Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
 ui->setupUi(this);
 m_DataBase = QSqlDatabase::addDatabase("QODBC3");
 m_DataBase.setDatabaseName("DRIVER={SQL Server};SERVER=***;DATABASE=***;");
 m_DataBase.setUserName("***");
 m_DataBase.setPassword("***");
 GenerateGroups();
}
 
QPushButton* Widget::CreateButton(QIcon icon, QString caption, int id, const char* slot)
{
 QPushButton *button = new QPushButton(icon, caption, ui->programWidget);
 button->setGeometry(9,0,ui->programWidget->width()-18, 30);
 button->setProperty("id", id);
 button->setParent(ui->programWidget);
 connect(button, SIGNAL(clicked()), this, slot);
 QPropertyAnimation *anim = new QPropertyAnimation(button, "pos");
 anim->setEasingCurve(QEasingCurve::InOutBack);
 QPoint point(button->x(), 9 + (button->height()+5)*m_Buttons.size());
 anim->setStartValue(button->pos());
 anim->setEndValue(point);
 anim->setDuration(1000+100*m_Buttons.size());
 anim->setLoopCount(1);
 anim->start();
 m_Buttons.push_back(QPair<QPushButton*, QPropertyAnimation*>(button, anim));
 return button;
}
 
void Widget::GenerateGroups()
{
 DeleteButtons();
 openBase();
 QSqlQuery query(m_DataBase);
 query.prepare(QString("SELECT LCR_Groups.NameGroup, LCR_Groups.Icon, LCR_Groups.id "
                       "FROM LCR_GroupPrograms INNER JOIN "
                            "LCR_Groups ON LCR_GroupPrograms.id_Group = LCR_Groups.id INNER JOIN "
                            "LCR_Programs ON LCR_GroupPrograms.id_Program = LCR_Programs.id "
                       "ORDER BY LCR_Groups.NameGroup"));
 query.exec();
 while (query.next())
 {
   QByteArray icon = query.value(query.record().indexOf("Icon")).toByteArray();
   CreateButton(QIcon(QPixmap::fromImage(QImage::fromData(icon))),
                query.value(query.record().indexOf("NameGroup")).toString(),
                query.value(query.record().indexOf("id")).toInt(),
                SLOT(GenerateGroups()));
                //SLOT(OpenGroup()));
 }
 m_DataBase.close();
}
 
void Widget::DeleteButtons()
{
 for (int i=0; i<m_Buttons.size(); ++i)
 {
   QPair<QPushButton*, QPropertyAnimation*> pair = m_Buttons.at(i);
   pair.second->setStartValue(pair.first->pos());
   pair.second->setEndValue(QPoint(-pair.first->width(), pair.first->y()));
   pair.second->setDuration(500+i*100);
   pair.second->setLoopCount(1);
   pair.second->start();
   QTimer::singleShot(1000+i*100, pair.first, SLOT(deleteLater()));
   QTimer::singleShot(1000+i*100, pair.second, SLOT(deleteLater()));
 }
 m_Buttons.clear();
}
 
void Widget::openBase()
{
 if (!m_DataBase.open())
 {
   QMessageBox msgBox;
   msgBox.setStyleSheet(this->styleSheet());
   msgBox.setText(tr("Error connet to DB."));
   msgBox.setInformativeText(tr("Call to developer."));
   msgBox.setStandardButtons(QMessageBox::Ok);
   msgBox.exec();
   deleteLater();
 }
}
 

метод CreateButton добавляет кнопку на виджет и плавно ведет ее в позицию.

В конструкторе все отрабатывает, кнопки появляются. Но, при нажатии на кнопку при отрабатывании GenerateGroups() кнопки старые пропадают(так и должно быть), а новые не появляются (но создаются), хотя CreateButton отрабатывает.

В чем может быть проблемма?

ЗЫ: CreateButton - Создает кнопку и анимацию выпадания сверху виджета
GenerateGroups - Создает набор кнопок через CreateButton и вешает на них сигнал GenerateGroups
DeleteButtons - создает анимацию сдвигания налево и удаляет кнопку через 1сек
openBase - открывает БД
« Последнее редактирование: Январь 20, 2012, 10:29 от interv » Записан
interv
Гость
« Ответ #1 : Январь 20, 2012, 10:32 »

Проверил, анимация тут ен при чем. Значит при создании кнопки я както касячу
Код
C
 QPushButton *button = new QPushButton(icon, caption, ui->programWidget);
 button->setGeometry(9,0,ui->programWidget->width()-18, 30);
 button->setProperty("id", id);
 button->setParent(ui->programWidget);
Записан
interv
Гость
« Ответ #2 : Январь 20, 2012, 12:01 »

Оказалась ларчик просто открывался:
в конструкторе виджета при добавлении в него QPushButton свойство Visible автоматом ставиться в True
но! при добавлении после конструктора (например в методе) свойство Visible автоматом ставиться в False.

Лечиться SetVisible(true)
Записан
mutineer
Гость
« Ответ #3 : Январь 20, 2012, 12:03 »

Скорее дело не в конструкторе, а в том, что все виджеты изначально невидимы. А видимыми они делаются вместе с основным виджетом, когда ты делаешь ему show() в main
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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