Qt之容器控件(QToolBox)

简述

QToolBox类提供一列带标签的窗口小部件项目。

功能详述

工具箱是一个小部件,在这个小部件显示着一列带标签的选项卡。其中,当前选项卡下显示的当前项目。

每个项目都有一个itemText(),一个可选的itemIcon(),一个可选的itemToolTip()和一个widget()。可以使用setItemText(),setItemIcon()和setItemToolTip()更改项目的属性。可以使setItemEnabled()分别启用或禁用每个项目。

使用addItem()添加项目,或使用insertItem()在特定位置插入项目。项目总数由count()给出。可以使用delete删除项目,也可以使用removeItem()从工具箱中删除项目。组合removeItem()和insertItem()可以将项目移动到不同的位置。

当前项目窗口小部件的索引由currentIndex()返回,并使用setCurrentIndex()进行设置。可以使用indexOf()找到特定项目的索引,并且给定索引处的项目由item()返回。

当前项目更改时,将发出currentChanged()信号。

使用

效果

上面的效果模仿了Qt Designer的导航栏。

源码

    struct User {
        QString strName;  // 名字
        QString strIcon;  // 图像
    } widget[2][3] = {
        {
            {"Horizontal Spacer", ":/picture/horizontal_spacer.png"},
            {"Vertical Spacer", ":/picture/vertical_spacer.png"}
        },
        {
            {"Push Button", ":/picture/pushbutton.png"},
            {"Tool Button", ":/picture/tool_button.png"}
        }
    };

    QStringList groupList = {"Spacers", "Buttons"};

    QToolBox *toolBox = new QToolBox;
    toolBox->setContentsMargins(0, 0, 0, 0);

    for (int i = 0; i < static_cast<int>( sizeof (widget)/sizeof (widget[0]) ); i++) {
        QGroupBox *groupBox = new QGroupBox(this);
        groupBox->setContentsMargins(0, 0, 0, 0);
        groupBox->setFlat(true);
        groupBox->setStyleSheet("QGroupBox {background-color:white}");
        QVBoxLayout *vLayout = new QVBoxLayout(groupBox);
        vLayout->setMargin(0);

        for (int j = 0; j < static_cast<int>( sizeof (widget[0])/sizeof (widget[0][0]) ); j++) {
            QPushButton *itemBtn = new QPushButton;
            itemBtn->setFlat(true);
            itemBtn->setStyleSheet("QPushButton {text-align:left}");
            itemBtn->setIcon(QIcon(widget[i][j].strIcon));
            itemBtn->setText(widget[i][j].strName);

            vLayout->addWidget(itemBtn);
        }

        groupBox->setLayout(vLayout);
        toolBox->addItem(groupBox, groupList[i]);
    }

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

    this->setLayout(gridLayout);

QTooBox是一个很常见的控件种类,比如QQ好友列表。

常用设置

添加条目

toolBox->addItem(groupBox, "第一个条目");
toolBox->addItem(groupBox, QIcon(":/picture/icon.jpg"), "第二个条目");//带icon

在添加条目的时候,我们需要指定条目名称,同时可以决定是否设定icon。

插入条目

toolBox->insertItem(1, groupBox, "第一个条目");
toolBox->insertItem(1, groupBox, QIcon(":/picture/icon.jpg"), "第二个条目");//带icon

移除条目

toolBox->removeItem(1)

使能条目

toolBox->setItemEnabled(1, true);

信号槽

槽函数

名称描述
setCurrentIndex(int index)设置当前条目索引
setCurrentWidget(QWidget *widget)指定当前控件

信号

名称描述
currentChanged(int index)当控件改变时触发,并传递改变后的条目的索引值

引用

[1] Qt助手

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值