Qt 自定義彈出窗口界面

1.自定義彈出菜單窗口

 此demo演示彈出一個QListWidget,可以修改成各種Widget。

①需要明白Qt的座標系統

②需要知道Qt style設置。

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

2.源碼

//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));
}

 3.運行截圖

 widget.ui

 運行界面

 

大家覺得OK,請點個贊👍👍👍,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章