사용자 정의 레이아웃 관리자
3608 단어 QT 연구 / KDE
다음은 사용자 정의 레이아웃 관리 자 를 실현 하 는 실례 로 CardLayout 라 고 합 니 다.
헤더 파일:
#ifndef CARDLAYOUT_H
#define CARDLAYOUT_H
#include
#include
#include
class CardLayout : public QLayout
{
Q_OBJECT
public:
explicit CardLayout(QWidget *parent = 0, int margin = 0, int dist=-1);
~CardLayout();
void addItem(QLayoutItem *);
QSize sizeHint() const;
QSize minimumSize() const;
int count() const;
QLayoutItem *itemAt(int index) const;
QLayoutItem *takeAt(int index);
void setGeometry(const QRect &);
private:
QList list;
};
#endif // CARDLAYOUT_H
실행 파일:
#include "cardlayout.h"
CardLayout::CardLayout(QWidget *parent,
int margin, int dist) :
QLayout(parent)
{
setMargin(margin);
setSpacing(dist);
}
CardLayout::~CardLayout()
{
QLayoutItem *item;
while ((item = takeAt(0)))
delete item;
}
int CardLayout::count() const
{
// returns the number of QLayoutItems
return list.size();
}
QLayoutItem *CardLayout::itemAt(int index) const
{
return list.value(index);
}
QLayoutItem *CardLayout::takeAt(int index)
{
return index >= 0 && index < list.size() ? list.takeAt(index) : 0;
}
void CardLayout::addItem(QLayoutItem *item)
{
list.append(item);
}
void CardLayout::setGeometry(const QRect &r)
{
QLayout::setGeometry(r);
if (list.size() == 0)
return ;
int w = r.width() - (list.count() - 1) * spacing();
int h = r.height() - (list.count() - 1) * spacing();
int i = 0;
while (i < list.size()) {
QLayoutItem *o = list.at(i);
QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h);
o->setGeometry(geom);
++i;
}
}
QSize CardLayout::sizeHint() const
{
QSize s(0, 0);
int n = list.count();
if (n > 0)
s = QSize(100, 70);//start with a nice default size
int i = 0;
while (i < n) {
QLayoutItem *o = list.at(i);
s = s.expandedTo(o->sizeHint());
++i;
}
return s + n * QSize(spacing(), spacing());
}
QSize CardLayout::minimumSize() const
{
QSize s(0, 0);
int n = list.count();
int i = 0;
while (i < n) {
QLayoutItem *o = list.at(i);
s = s.expandedTo(o->sizeHint());
++i;
}
return s + n * QSize(spacing(), spacing());
}
테스트 코드:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel *l1 = new QLabel("label1");
QLabel *l2 = new QLabel("label2");
QLabel *l3 = new QLabel("label3");
QLabel *l4 = new QLabel("label4");
CardLayout *layout = new CardLayout;
layout->addItem(new QWidgetItem(l1));
layout->addItem(new QWidgetItem(l2));
layout->addWidget(l3);
layout->addWidget(l4);
qDebug()<count();
QWidget *central = new QWidget(this);
central->setLayout(layout);
setCentralWidget(central);
}