Qt之容器控件(QMdiArea)

简述

QMdiArea(Multiple Document Interface Area)提供了一个可以同时显示多个文档窗口的区域。

本质上来说,QMdiArea就像是多文档窗口的窗口管理器。例如,它将它所管理的窗口绘制在它上面,并且以级联或者平铺的方式放置这些窗口。通常情况下,QMdiArea用作QMainWindow的中心控件,以此来创建一个MDI应用程序。但是,它也可以被放置在任何布局类中。

QMdiArea支持所有的窗口标志,只要这些窗口标志被当前控件样式支持。

功能详述

QMdiArea中的子窗口是QMdiSubWindow的实例化对象。通过调用addSubWindow来将他们加入MDI区域。通常情况下是传递一个QWidget作为内部控件给这个函数。但是直接传递QMdiSubWindow也是可以的。

当一个子窗口获得键盘焦点或者setFocus被调用,这个子窗口便被激活。当激活窗口改变时,subWindowActivated信号会被触发。activeSubWindow函数会返回当前激活的窗口。

subWindowList是一个十分方便的函数,可以用来返回所有子窗口列表。这个信息可以被用在包含窗口列表的弹出菜单上面。

WindowOrder用来指定子窗口的排列规则。子窗口的排列规则直接影响到subWindowList()、activateNextSubWindow()以及activatePreviousSubWindow()。而且,当窗口使用级联或者平铺时,这个信息也很有用。

QMdiArea为子窗口提供了两个内建的布局策略:cascadeSubWindows()和tileSubWindows()。这两个策略都是槽函数而且很容易与菜单条目连接。

注意 QMdiArea的默认滚动条属性是Qt::ScrolBarAlwaysOff。

使用

上面是Qt Designer的设计窗口,这种多窗口效果多半就是用QMdiArea实现的。

上面是Qt自带的example,用于实现多文本窗口同时编辑。

这是我自己写的小例子,源码如下

    QGroupBox *groupBox_0 = new QGroupBox("互斥单选按钮组");
    QRadioButton *radioBtn_0 = new QRadioButton("&Radio Button 1");
    QRadioButton *radioBtn_1 = new QRadioButton("R&adio Button 2");
    QRadioButton *radioBtn_2 = new QRadioButton("Ra&dio Button 3");
    QVBoxLayout *vLayout_0 = new QVBoxLayout;
    vLayout_0->addWidget(radioBtn_0);
    vLayout_0->addWidget(radioBtn_1);
    vLayout_0->addWidget(radioBtn_2);
    groupBox_0->setLayout(vLayout_0);

    QGroupBox *groupBox_1 = new QGroupBox("非互斥多选按钮组");
    QCheckBox *checkBox_0 = new QCheckBox("&Checkbox 1");
    QCheckBox *checkBox_1 = new QCheckBox("C&heckbox 2");
    QCheckBox *checkBox_2 = new QCheckBox("&Tri-state Button");
    checkBox_2->setTristate(true);
    QVBoxLayout *vLayout_1 = new QVBoxLayout;
    vLayout_1->addWidget(checkBox_0);
    vLayout_1->addWidget(checkBox_1);
    vLayout_1->addWidget(checkBox_2);
    groupBox_1->setLayout(vLayout_1);

    QMdiArea *mdiArea = new QMdiArea;
    mdiArea->tileSubWindows();
    mdiArea->cascadeSubWindows();
    mdiArea->setDocumentMode(true);

    mdiArea->addSubWindow(groupBox_0);
    mdiArea->addSubWindow(groupBox_1);

    QMainWindow *mainWindow = new QMainWindow;

    mainWindow->setCentralWidget(mdiArea);

    QGridLayout *gridLayout = new QGridLayout;
    gridLayout->addWidget(mainWindow);

    this->setLayout(gridLayout);

常用设置

添加与移除子窗口

添加子窗口使用addSubWindow,移除窗口使用removeSubWindow

mdiArea->addSubWindow(groupBox_0);
mdiArea->removeSubWindow(groupBox_0);

设置背景色

工作空间背景色默认为灰色,可以使用setBackground来设置

mdiArea->setBackground(QBrush(Qt::green));

效果

设置最大化模式

当活动子窗口最大化时,默认行为是最大化下一个激活的子窗口。如果不希望出现这种情况,可以通过下面的方法来设置

mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation);

默认情况

设置之后

设置视图模式

有两种视图模式,可以通过setViewMode来设置。

常量描述
QMdiArea::SubWindowView0显示带有窗口框架的子窗口(默认)。
QMdiArea::TabbedView1在选项卡栏中显示带有选项卡的子窗口。

效果

在该模式下,setTabPositon、setTabShape、setTabClosable、setTabsMovable灯标签栏相关函数可用,具体效果见Qt之容器空间(QTabWidget)

设置激活顺序

指定用于对由subWindowList()返回的子窗口列表进行排序的条件。排列窗口时,函数cascadeSubWindows()和tileSubWindows()遵循此顺序。

常量描述
QMdiArea::CreationOrder0窗口按其创建顺序返回。
QMdiArea::StackingOrder1窗口按其堆叠顺序返回,最上面的窗口在列表的最后。
QMdiArea::ActivationHistoryOrder2窗口将按照它们被激活的顺序返回。

信号槽

名称描述
activateNextSubWindow()激活下一个窗口
activatePreviousSubWindow()激活上一个窗口
cascadeSubWindows()级联排布子窗口
closeActiveSubWindow()关闭活动窗口
closeAllSubWindows()关闭所有窗口
setActiveSubWindow(QMdiSubWindow *window)设置特定窗口为活动窗口
testOption(QMdiArea::AreaOption option) const平铺排布子窗口

信号

名称描述
subWindowActivated(QMdiSubWindow *window)特定子窗口被激活时触发,参数为当前激活的QMdiSubWindow指针

引用

[1] Qt助手

  • 21
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,你可以使用拖放操作来将按钮(或其他控件)拖动到容器控件中。下面是一个简单的示例,展示如何实现这个功能: 1. 首先,在容器控件的类中,你需要启用拖放操作。这可以通过在构造函数中设置setAcceptDrops(true)来完成。 ```cpp ContainerWidget::ContainerWidget(QWidget *parent) : QWidget(parent) { setAcceptDrops(true); } ``` 2. 然后,在按钮(或其他控件)的类中,你需要实现拖放事件。这包括mousePressEvent、mouseMoveEvent和drag事件。 ```cpp ButtonWidget::ButtonWidget(QWidget *parent) : QPushButton(parent) { // 设置按钮可拖动 setDragEnabled(true); } void ButtonWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // 鼠标左键按下时,开始拖动按钮 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text()); // 设置拖动数据为按钮的文本 drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } } void ButtonWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { // 鼠标左键按下并移动时,移动按钮 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text()); // 设置拖动数据为按钮的文本 drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } } ``` 3. 最后,在容器控件的类中,你需要实现拖放事件。这包括dragEnterEvent和dropEvent。 ```cpp void ContainerWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void ContainerWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasText()) { QString buttonText = event->mimeData()->text(); ButtonWidget *button = new ButtonWidget(this); button->setText(buttonText); button->move(event->pos()); button->show(); event->acceptProposedAction(); } } ``` 现在,你可以创建一个容器控件和多个按钮控件,并将这些按钮拖动到容器控件中。按钮会在容器中显示,并且你可以随意移动它们。 希望这可以帮助到你!如果有任何进一步的问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值