1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QPropertyAnimation>
class CheckableMenu : public QWidget
{
Q_OBJECT
public:
CheckableMenu(QWidget *parent = 0)
: QWidget(parent), isChecked(false), animation(this, "size")
{
animation.setDuration(1000);
layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
setLayout(layout);
}
void addWidget(QWidget *widget) {
layout->addWidget(widget);
}
public slots:
void checked() {
if (isChecked) {
animation.setStartValue(QSize(width(), 0));
animation.setEndValue(lastSize);
animation.start();
isChecked = false;
} else {
lastSize = size();
animation.setStartValue(lastSize);
animation.setEndValue(QSize(width(), 0));
animation.start();
isChecked = true;
}
}
private:
QVBoxLayout* layout;
bool isChecked;
QSize lastSize;
QPropertyAnimation animation;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0) : QMainWindow(parent)
{
QWidget* w = new QWidget;
QVBoxLayout* l = new QVBoxLayout;
l->setContentsMargins(0, 0, 0, 0);
l->setSpacing(0);
w->setLayout(l);
setCentralWidget(w);
QPushButton* item1 = new QPushButton("item 1");
l->addWidget(item1);
CheckableMenu* submenu1 = new CheckableMenu();
l->addWidget(submenu1);
connect(item1, SIGNAL(clicked()), submenu1, SLOT(checked()));
QPushButton* subitem1 = new QPushButton("sub item 1");
submenu1->addWidget(subitem1);
QPushButton* subitem2 = new QPushButton("sub item 2");
submenu1->addWidget(subitem2);
QPushButton* subitem3 = new QPushButton("sub item 3");
submenu1->addWidget(subitem3);
QPushButton* item2 = new QPushButton("item 2");
l->addWidget(item2);
QPushButton* item3 = new QPushButton("item 3");
l->addWidget(item3);
l->addStretch(1);
}
};
#endif // MAINWINDOW_H |
Partager