qt自定义下拉菜单框

Qt自带的QCombBox下拉能够显示的东西有限,想添加其他的控件不太方便,所以就想自己定义一个,基本思路是,一个QLineEdit,一个QPushButton,一个QListWidget组成一个组合控件。

过程:

1、将QPushButton嵌入进QLineEdit中。

_button->setText("...");

_lineEdit->setReadOnly(true);
_lineEdit->setAlignment(Qt::AlignCenter);
_lineEdit->setText("test");
this->_lineEdit->setMaximumWidth(100);

QVBoxLayout* mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(this->_lineEdit);

QWidgetAction* widgetAction = new QWidgetAction(this->_lineEdit);
widgetAction->setDefaultWidget(this->_button);
_lineEdit->addAction(widgetAction, QLineEdit::TrailingPosition);

2、绑定按钮信号槽

connect(_button, &QPushButton::clicked, this, &DLevitaComboBox::on_buttonClicked);

这里没有对按键实施按下检查,是为了将来在其他条件下需要收回下拉菜单时,操作起来更加方便。直接调用相关的槽函数即可。

3、编写槽函数

void DLevitaComboBox::on_buttonClicked()
{
    _check = !_check; //初始化为false
    int widgetStartX = this->mapToGlobal(QPoint(0, 0)).x();
    int widgetStartY = this->mapToGlobal(QPoint(0, 0)).y() + this->height();
    int widgetStartWidth = _width;
    int widgetStartHeight = _height;

    QRect startRect(widgetStartX, widgetStartY, widgetStartWidth, widgetStartHeight);
    QRect endRect(widgetStartX, widgetStartY, widgetStartWidth, 0);

    if (_check)
    {
        QRect temp;
        temp = endRect;
        endRect = startRect;
        startRect = temp;
    }

    QPropertyAnimation* animation = new QPropertyAnimation(_widget, "geometry");
    animation->setStartValue(startRect);
    animation->setEndValue(endRect);
    QObject::connect(animation, &QPropertyAnimation::finished, this, [=]() {
        if (!_check)
        {
            _widget->setVisible(true);
        }
        _widget->raise();
        });
    _widget->setVisible(true);
    animation->start(QAbstractAnimation::DeletionPolicy::DeleteWhenStopped);
}

槽函数中使用动画类实现widget的收缩。

4、设置QListWidget

原本计划是使用一个widget来创建下拉框,但尝试后未能成功,原因不明。因此,我改用了一个QListWidget来替代,并且需要对这个QListWidget进行一系列设置,以便它能像widget那样工作。

_widget->setParent(this); //widget就是QListWidget
_widget->setVisible(false);
_widget->setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);

QListWidgetItem* pItem = new QListWidgetItem();
QWidget* mainWidget = new QWidget();

pItem->setSizeHint(QSize(_width, _height));
_widget->addItem(pItem);
_widget->setItemWidget(pItem, mainWidget);
_widget->horizontalScrollBar()->hide(); //隐藏横向滚动条
_widget->setStyleSheet(
    "QListWidget{"
    "    color: gray;"
    "    font-size: 12px;"
    "    background: #FAFAFD;"
    "    outline: 0; /* 去除焦点时的虚线框 */"
    "}"
    "QListWidget::item {"
    "    border: none; /* 取消边框 */"
    "    padding: 2px; /* 可选的内边距 */"
    "}"
    "QListWidget::item:selected {"
    "    background: none; /* 取消选中背景 */"
    "}"
    "QScrollBar{"
    "    width: 0;"
    "    height: 0;"
    "}"
);

_widget->setSelectionMode(QAbstractItemView::NoSelection);

效果演示:

效果演示

这里空隙太大是因为这个Widget中只有一个QLineEdit,而且我限定了这个QLineEdit的大小,实际使用中这个下拉框是紧贴在QLineEdit下面的。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt自定义Ribbon菜单可以通过以下步骤完成。 首先,创建一个新的Qt项目。在项目中包含QtRibbon控件相关的头文件和库。 其次,定义你想要的Ribbon菜单的外观和布局。可以使用Qt提供的默认样式,也可以通过修改样式表来自定义外观。 接下来,创建菜单项。可以使用QAction或者QMenu来创建菜单项,然后将它们添加到Ribbon菜单中。 然后,设置菜单项的图标和文字。可以使用QIcon类来设置菜单项的图标,使用setText()方法来设置菜单项的文字。 接着,为菜单项添加功能。可以连接菜单项的triggered()信号到槽函数中,实现菜单项的点击功能。 最后,展示Ribbon菜单。将Ribbon菜单添加到主窗口的布局中,然后显示主窗口。 需要注意的是,Ribbon菜单是一个相对较新的控件,并且在不同的平台上可能有不同的外观和行为。因此,在自定义Ribbon菜单时,需要仔细测试和调整以确保在不同平台上都有良好的用户体验。 希望以上回答能对您有所帮助。 ### 回答2: Qt是一个跨平台的C++开发架,提供了丰富的功能和工具,可以用于开发桌面应用程序。自定义Ribbon菜单是其中的一个功能。 Ribbon菜单是一种常见的用户界面设计元素,它通常用于快速访问常用的功能和工具。Qt提供了QtitanRibbon插件,可以方便地实现自定义的Ribbon菜单。 要自定义Ribbon菜单,首先需要安装QtitanRibbon插件。安装完成后,可以在Qt Designer中添加Ribbon控件,并根据需要调整其外观和行为。可以设置菜单的布局、样式、颜色等属性,并添加自定义的按钮和选项。 在代码中,可以使用QtitanRibbon提供的API来处理Ribbon菜单的事件和用户交互。可以定义槽函数来响应按钮的点击、选项的选择等操作。通过槽函数,可以实现具体的功能逻辑,例如打开文件、保存数据等操作。 除了使用QtitanRibbon插件,也可以使用Qt自带的工具和功能来实现自定义的Ribbon菜单。可以使用QToolBar、QAction等类来创建菜单的控件和按钮,并使用信号和槽机制来处理用户的交互。可以自定义菜单的布局、样式和行为,并根据需要添加自定义的功能和工具。 总之,通过使用Qt提供的功能和工具,可以方便地实现自定义的Ribbon菜单。无论是使用QtitanRibbon插件还是Qt自带的功能,都可以根据需求来设计和实现用户友好的Ribbon菜单界面。 ### 回答3: 在Qt自定义Ribbon菜单可以通过以下步骤实现: 1. 创建一个新的Qt应用程序项目并打开你想要添加自定义Ribbon菜单的主窗口。 2. 在主窗口中添加一个QMainWindow和一个QMenuBar。 3. 创建一个新的QWidget,作为Ribbon菜单的容器。 4. 将QWidget设置为QMainWindow的centralWidget(),以便显示Ribbon菜单。 5. 使用QVBoxLayout或其他布局管理器,将Ribbon菜单中的各个功能区或选项分组逐个添加到QWidget中。 6. 为每个功能区创建一个QGroupBox,并使用QGridLayout或其他布局管理器在功能区中添加需要的控件和操作。 7. 根据需要向每个功能区中添加按钮、复选、下拉列表等控件,并为它们添加相应的槽函数或信号连接。 8. 在主窗口的菜单栏中添加一个“Ribbon”选项,用于显示/隐藏Ribbon菜单。 9. 在“Ribbon”选项的槽函数中,通过QWidget的setVisible()函数来显示或隐藏Ribbon菜单。 10. 运行程序,你将看到自定义的Ribbon菜单在主窗口中显示,并且可以与其中的控件进行交互。 需要注意的是,Qt并没有提供内置的Ribbon菜单控件,因此我们需要自己创建一个类似于Ribbon菜单的容器,并在其中添加各种控件和操作。此外,可以根据自己的需求和设计风格来自定义Ribbon菜单的样式和布局。 希望以上回答能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值