Qt學習筆記-Widget佈局管理

Qt學習筆記4-Widget佈局管理

 
 
 
以《C++ GUI Programming with Qt 4, Second Edition》爲參考

實例:查找對話框程序員

包含三個文件,finddialog.h,finddialog.cpp及main.cpp。app

//finddialog.h代碼函數

#ifndef FINDDIALOG_H
#define FINDDIALOG_H佈局

#include <QDialog>學習

class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;ui

class FindDialog : public QDialog
{
    Q_OBJECTthis

public:
    FindDialog(QWidget *parent = 0);spa

signals:
    void findNext(const QString &str, Qt::CaseSensitivity cs);
    void findPrevious(const QString &str, Qt::CaseSensitivity cs);.net

private slots:
    void findClicked();
    void enableFindButton(const QString &text);blog

private:
    QLabel *label;
    QLineEdit *lineEdit;
    QCheckBox *caseCheckBox;
    QCheckBox *backwardCheckBox;
    QPushButton *findButton;
    QPushButton *closeButton;
};

#endif

註釋:

class FindDialog : public QDialog表示繼承的對話框,在Qt中QDialog是一個經常使用到的類。

Q_OBJECT是一個宏,是信號槽所必須的,在使用信號槽時,在類的開始要使用這個宏,不然在編譯時候會出錯。

接下來定義了信號和槽,對於信號和槽之後會詳細介紹。

//finddialog.cpp代碼

#include <QtGui>

#include "finddialog.h"

FindDialog::FindDialog(QWidget *parent)


    : QDialog(parent)
{
    label = new QLabel(tr("Find &what:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);

    caseCheckBox = new QCheckBox(tr("Match &case"));
    backwardCheckBox = new QCheckBox(tr("Search &backward"));

    findButton = new QPushButton(tr("&Find"));
    findButton->setDefault(true);
    findButton->setEnabled(false);

    closeButton = new QPushButton(tr("Close"));

    connect(lineEdit, SIGNAL(textChanged(const QString &)),
            this, SLOT(enableFindButton(const QString &)));
    connect(findButton, SIGNAL(clicked()),
            this, SLOT(findClicked()));
    connect(closeButton, SIGNAL(clicked()),
            this, SLOT(close()));

    QHBoxLayout *topLeftLayout = new QHBoxLayout;
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);

    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);

    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);

    setWindowTitle(tr("Find"));
    setFixedHeight(sizeHint().height());
}

void FindDialog::findClicked()
{
    QString text = lineEdit->text();
    Qt::CaseSensitivity cs =
            caseCheckBox->isChecked() ? Qt::CaseSensitive
                                      : Qt::CaseInsensitive;
    if (backwardCheckBox->isChecked()) {
        emit findPrevious(text, cs);
    } else {
        emit findNext(text, cs);
    }
}

void FindDialog::enableFindButton(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());
}

在finddialog.cpp中主要就是實現了信號與槽的關聯以及佈局管理。這裏主要說明一下佈局管理。

Qt提供了在窗口組件上管理子窗口組件的管理方式:

1.絕對位置方式:經過基類QWidget提供的setGeometry() 設置子窗口組件的大小及其在父窗口的位置。缺點:不能調整子窗口大小,不能隨父窗口大小改變而改變,子窗口大小和文本可能會被截斷,程序員須要不斷計算子窗口大小和位置。

2.手工佈局方式:也是經過基類QWidget提供的setGeometry() 設置子窗口組件的大小及其在父窗口的位置。不過它與第一種不一樣,它是經過重載QWidget::resizeEvent(QResizeEvent*)函數來實現。當父窗口改變時子窗口會作出相應改變。可是它仍然須要程序員手工計算。

3.佈局管理器方式:這是最好的Qt佈局管理方式,它主要提供了4中方式:

(1)水平佈局管理器:QHBoxLayout,按水平方向組織窗口組件

(2)垂直佈局管理器:QVBoxLayout,按垂直方向組織窗口組件

(3)網格佈局管理器:QGridLayout,按二維網格方式組織窗口組件

(4)棧佈局管理器:QStackedLayout,按照相似於棧的方式組織窗口組件,在某一時刻只有一個窗口組件是可見的,Qt沒有提供對該佈局管理器的支持,可是提供了一個棧部件,QStackedWidget,可使用它來實現棧佈局管理器。

在上面的例子中,使用其中的兩個佈局管理器,水平和垂直佈局管理器。下面的圖是以上代碼佈局管理後的一個圖

 

Qt學習筆記4-Widget佈局管理 - ugene - 愛在未來時
 對照這個圖與上面的代碼分析一下是怎麼實現這樣的佈局的。

 

 

QHBoxLayout *topLeftLayout = new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);

首先建立水平佈局,而後再在最上面左邊添加兩個組件:label,lineEdit

QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheckBox);

而後又建立垂直佈局,而後再把上面的水平佈局添加到該垂直佈局的最上面,接着添加兩個組件:caseCheckBox,backwardCheckBox。

QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch();

接着建立了一個垂直佈局,添加兩個組件:findButton,closeButton,以後加入了拉伸係數,也能夠叫彈簧,由於就像彈簧同樣把這些組件頂起來,能夠試試在findButton和closeButton直接加入彈簧看看是什麼結果。

QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
setLayout(mainLayout);

最後,又建立了一個水平佈局,在這個水平佈局中添加了前面建立的後兩個佈局:水平佈局和垂直佈局。以後就設置佈局管理器,setLayout(),參數是佈局管理器名。

佈局管理器就說這麼多,後面還會提到。佈局管理器在Qt中很是實用。

下面是該實例的整體類關係圖:

 

Qt學習筆記4-Widget佈局管理 - ugene - 愛在未來時
 能夠根據上述代碼體會一下。

 

 

最後的是mian代碼

// main.cpp代碼

#include <QApplication>

#include "finddialog.h"

int main(int argc, char *argv[]){    QApplication app(argc, argv);    FindDialog *dialog = new FindDialog;    dialog->show();    return app.exec();

相關文章
相關標籤/搜索