Название: Динамическое создание QPushButton
Отправлено: 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 - открывает БД
Название: Re: Динамическое создание QPushButton
Отправлено: interv от Января 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);
Название: Re: Динамическое создание QPushButton
Отправлено: interv от Января 20, 2012, 12:01
Оказалась ларчик просто открывался: в конструкторе виджета при добавлении в него QPushButton свойство Visible автоматом ставиться в True но! при добавлении после конструктора (например в методе) свойство Visible автоматом ставиться в False.
Лечиться SetVisible(true)
Название: Re: Динамическое создание QPushButton
Отправлено: mutineer от Января 20, 2012, 12:03
Скорее дело не в конструкторе, а в том, что все виджеты изначально невидимы. А видимыми они делаются вместе с основным виджетом, когда ты делаешь ему show() в main
|