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 - открывает БД