Qt 自定义弹出窗口界面

1.运行截图

 widget.ui

 运行界面

2.自定义弹出菜单窗口

 此demo演示弹出一个QListWidget,可以修改成各种Widget。

①需要明白Qt的坐标系统

②需要知道Qt style设置。

③需要用到的类QWidgetAction、QMenu、QListWidget

3.源码

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QListWidget>
#include <QMenu>
#include <QWidgetAction>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

private:
    void initDefulatUi();

private Q_SLOTS:
    void slotBtnClicked();

private:
    QListWidget *m_listWidget = nullptr;
    QWidgetAction *m_action = nullptr;
    QMenu *m_menu = nullptr;
};

#endif // WIDGET_H


//widget.cpp

#include "widget.h"
#include "ui_widget.h"

const QString g_strWgtStyle = "#widget\
{\
background-color: rgb(255, 255, 255);\
border: 1px solid #DCDFE6;\
border-radius: 4px;\
}";

const QString g_strLiEditStyle ="#lineEdit\
{\
border:0px;\
font-family: \"微软雅黑\";\
font-size: 20px;\
color: #303133;\
}";

const QString g_strBtnStyle = "#pushButton\
{\
background-color: rgb(255, 255, 255);\
border-image:url(\"D:/1.png\");\
}";

const QString g_strListWidgetStyle = "#listWidget{border:0px}";

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    initDefulatUi();

    m_listWidget = new QListWidget(ui->widget);
    m_listWidget->setObjectName("listWidget");
    m_listWidget->setStyleSheet(g_strListWidgetStyle);
    QStringList nameList;
    nameList<<"张三"<<"李四"<<"王五"<<"赵六";
    m_listWidget->addItems(nameList);

    m_action = new QWidgetAction(nullptr);
    m_action->setDefaultWidget(m_listWidget);

    m_menu = new QMenu(nullptr);
    m_menu->setWindowFlags(m_menu->windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
    m_menu->addAction(m_action);

    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::slotBtnClicked);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::initDefulatUi()
{
    ui->widget->setStyleSheet(g_strWgtStyle);
    ui->lineEdit->setStyleSheet(g_strLiEditStyle);
    ui->pushButton->setStyleSheet(g_strBtnStyle);

    ui->widget->setContentsMargins(5,0,5,0);
}

void Widget::slotBtnClicked()
{
    QPoint pos = ui->widget->pos();
    //获得右下角坐标
    QPoint posRightDown;
    posRightDown.setX(pos.x()+ui->widget->width());
    posRightDown.setY(pos.y()+ui->widget->height());

    m_menu->exec(this->mapToGlobal(posRightDown));
}

 

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

Mr.codeee

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值