Qt布局管理

Qt布局管理


By Xchen 20160628


分割窗口

类QSplitter

先看一个实例
example01:

#include "mainwindow.h"
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFont font("ZYSong18090",12);
    a.setFont(font);

    QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);
    QTextEdit *textLeft=new QTextEdit(QObject::tr("Left Widget"),splitterMain);
    textLeft->setAlignment(Qt::AlignCenter);

    QSplitter *splitterRight=new QSplitter(Qt::Vertical,splitterMain);
    splitterRight->setOpaqueResize(false);//设置窗口分割线是否实时显示
    QTextEdit *textUp=new QTextEdit(QObject::tr("Top Widget"),splitterRight);
    textUp->setAlignment(Qt::AlignCenter);
    QTextEdit *textBottom=new QTextEdit(QObject::tr("Bottom Widget"),splitterRight);
    textBottom->setAlignment(Qt::AlignCenter);

    splitterMain->setStretchFactor(1,1);//设置右窗口为可伸缩控件,即在整个对话框大小改变时右窗口大小随之改变
    splitterMain->setWindowTitle(QObject::tr("Splitter"));
    splitterMain->show();
    //MainWindow w;
    //w.show();

    return a.exec();
}

对于上面的例子,一定要在main()函数中建立QSplitter对象,这样可以直接将窗口分割,所以QSplitter对象相当于一个控件并且可以直接显示。

停靠窗口

类QDockWidget

example02:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(tr("DockWindows"));
    QTextEdit *text=new QTextEdit(this);
    text->setText(tr("Main Window"));
    text->setAlignment(Qt::AlignCenter);
    setCentralWidget(text);

    QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);
    dock->setFeatures(QDockWidget::DockWidgetMovable);
    dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
    QTextEdit *text1=new QTextEdit();
    text1->setText(tr("this is dockwindow1"));
    dock->setWidget(text1);
    addDockWidget(Qt::RightDockWidgetArea,dock);

    dock=new QDockWidget(tr("DockWindow2"),this);
    dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
    dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
    QTextEdit *text2=new QTextEdit();
    text2->setText(tr("this is dockwindow2"));
    dock->setWidget(text2);
    addDockWidget(Qt::RightDockWidgetArea,dock);

    dock=new QDockWidget(tr("DockWindow3"),this);
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
    dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
    QTextEdit *text3=new QTextEdit();
    text3->setText(tr("this is dockwindow1"));
    dock->setWidget(text3);
    addDockWidget(Qt::RightDockWidgetArea,dock);
}

在这个例子中可以看出停靠窗口QDockWidget的使用步骤为:
1、创建QDockWidget对象的停靠窗口
2、设置窗口属性

    QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);
    dock->setFeatures(QDockWidget::DockWidgetMovable);
    dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);

3、新建控件

    QTextEdit *text1=new QTextEdit();
    text1->setText(tr("this is dockwindow1"));

4、将控件插入停靠窗体

    dock->setWidget(text1);

5、将停靠窗口加入MainWindow

    addDockWidget(Qt::RightDockWidgetArea,dock);

堆栈窗口

类QStackedWidget

example03:

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("StackedWidget"));
    list=new QListWidget(this);
    list->insertItem(0,tr("window1"));
    list->insertItem(1,tr("window2"));
    list->insertItem(2,tr("window3"));

    label1=new QLabel(tr("this is window1"));
    label2=new QLabel(tr("this is window2"));
    label3=new QLabel(tr("this is window3"));

    stack=new QStackedWidget(this);
    stack->addWidget(label1);
    stack->addWidget(label2);
    stack->addWidget(label3);

    QHBoxLayout *mainLayout=new QHBoxLayout(this);
    mainLayout->setMargin(5);
    mainLayout->setSpacing(5);
    mainLayout->addWidget(list);
    mainLayout->addWidget(stack,0,Qt::AlignHCenter);
    mainLayout->setStretchFactor(list,1);
    mainLayout->setStretchFactor(stack,3);
    connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
}

堆栈窗口的使用多与QListWidget和QComboBox配合使用。例子中是让堆栈窗口与QListWidget配合使用。

基本布局

类QLayout

它们的继承关系:

这里写图片描述
可以在布局中常用的方法为addWidget()和addLayout()就可以将指定控件加入到布局中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值