사용자 정의 레이아웃 관리자

3608 단어 QT 연구 / KDE
사용자 정의 레이아웃 관리 자 를 만 들 려 면 QLayout 클래스 에서 파생 되 고 다음 과 같은 방법 과 데이터 구 조 를 정의 해 야 합 니 다.
  • 레이아웃 관리자 의 각 항목 의 데이터 구 조 를 저장 합 니 다. 각 항목 은 하나의 QLayout Item 입 니 다.
  • addItem () 은 레이아웃 관리자 에 항목 을 추가 하 는 방법 을 정의 합 니 다.
  • setGeometry (), 레이아웃 을 어떻게 실행 합 니까?
  • sizeHint (), 레이아웃 관리자 가 우선 선택 한 크기 입 니 다.
  • itemAt (), 레이아웃 관리자 에서 어떻게 이 항목 들 을 교체 합 니까?
  • takeAt (), 레이아웃 관리자 에서 이 항목 을 어떻게 삭제 합 니까?
  • 대부분의 경우 미니 멈 사이즈 (minimumSize) 를 실현 하 는 방법 이 필요 하 다.

  • 다음은 사용자 정의 레이아웃 관리 자 를 실현 하 는 실례 로 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);
    }

    좋은 웹페이지 즐겨찾기