QT Linux窗口完全置顶,自定义标题栏,可拖动,圆角(二)

第一篇文章基本实现了功能,点我查看文章
但是还有一些不完美的地方。
比如
1、有的系统鼠标拖动标题。对话框移动会有问题
2、对话框隐藏再显示,会获取不到焦点。
所以进行了一些优化

TopDialog::TopDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TopDialog)
{
    ui->setupUi(this);
    setWindowFlags( Qt::FramelessWindowHint
    | Qt::WindowStaysOnTopHint
    | Qt::Tool
    | Qt::X11BypassWindowManagerHint );//改动点
    pLabel = new QLabel(this);
    pLabel->setText("信息提交");
    pLabel->setAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
    pLabel->setStyleSheet("\
    background-color:hsl(160,0,240);\
    border-top-left-radius:5px;\
    border-top-style:solid;border-top-width:1px;border-top-color:rgb(198,198,198);\
    border-left-style:solid;border-left-width:1px;border-left-color:rgb(198,198,198);\
    border-right-style:solid;border-right-width:1px;border-right-color:rgb(198,198,198);\
    border-top-right-radius:5px;\
                            ;");

    pLabel->setGeometry(0,0,this->width(),30);
    setAttribute(Qt::WA_TranslucentBackground);  //设置窗口背景透明

    pLabel->installEventFilter(this);
    this->setStyleSheet("\
                        QDialog{\
                        background-color:rgb(248,248,248);\
                        border-radius:5px;\
                        border-style:solid;\
                        border-width:1px;\
                        border-color:rgb(198,198,198);\
                        \
                        }");
}

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

bool TopDialog::eventFilter(QObject *obj,QEvent* ev)
{
    if(obj == pLabel){
        if(ev->type()==QEvent::Type::MouseButtonPress)//判断是否有鼠标点击事件
        {
            QMouseEvent* e=static_cast<QMouseEvent*> (ev);
            if(e->button()==Qt::LeftButton)//判断是否是左键点击
            {
                pos=e->pos();
                return true;//改动点
            }
        }
        else if(ev->type()==QEvent::Type::MouseMove)//判断是否有鼠标移动事件
        {
            QMouseEvent* e=static_cast<QMouseEvent*> (ev);
            if(e->buttons()==Qt::LeftButton)//判断历史点击是否是左键点击
            {
                int x,y;
                x=e->pos().x()-pos.x();
                y=e->pos().y()-pos.y();
                this->move(this->x()+x,this->y()+y);
                return true;//改动点
            }
        }
    }
    return QDialog::eventFilter(obj,ev);
}

void TopDialog::paintEvent(QPaintEvent* event)
{
    QStyleOption opt;
    opt.init(this);
    QPainter painter(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
}

void TopDialog::showEvent(QShowEvent* event)
{
    setWindowFlags( Qt::FramelessWindowHint
    | Qt::WindowStaysOnTopHint
    | Qt::Tool
    | Qt::X11BypassWindowManagerHint );//改动点
    activateWindow();
}

void TopDialog::enterEvent(QEvent* event)
{
    setWindowFlags( Qt::FramelessWindowHint
    | Qt::WindowStaysOnTopHint
    | Qt::Tool
    | Qt::X11BypassWindowManagerHint );//改动点
    activateWindow();
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux下,可以通过自定义QWidget来实现自定义标题栏。具体实现步骤如下: 1. 创建一个继承自QWidget的类,用于实现自定义标题栏。 ```cpp class MyTitleBar : public QWidget { Q_OBJECT public: explicit MyTitleBar(QWidget *parent = nullptr); protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; private: QPoint m_lastPos; }; ``` 2. 在构造函数中设置标题栏的大小、背景色和布局。 ```cpp MyTitleBar::MyTitleBar(QWidget *parent) : QWidget(parent) { setFixedHeight(30); setStyleSheet("background-color: #333333"); QHBoxLayout *layout = new QHBoxLayout(); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); setLayout(layout); } ``` 3. 重写mousePressEvent和mouseMoveEvent函数,实现标题栏拖动。 ```cpp void MyTitleBar::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_lastPos = event->globalPos() - this->parentWidget()->geometry().topLeft(); } } void MyTitleBar::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { QPoint pos = event->globalPos() - m_lastPos; this->parentWidget()->move(pos); } } ``` 4. 在主窗口中添加自定义标题栏,并将系统标题栏隐藏。 ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle("Custom Title Bar"); setWindowFlags(Qt::FramelessWindowHint | windowFlags()); MyTitleBar *titleBar = new MyTitleBar(this); setMenuWidget(titleBar); // 添加其他控件及布局 // ... } ``` 5. 编译运行程序,即可看到自定义标题栏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值