使用java和qt开发远程控制系统-主界面设计

5 篇文章 0 订阅
这篇博客介绍了如何使用Qt的QSS样式表和自定义绘图技术来创建具有圆角边框和阴影效果的对话框。作者通过创建一个名为MDialog的类,继承自QDialog,并在其中实现了这些效果。MDialog包含标题栏、窗口阴影,并允许设置标题、隐藏元素等。源代码展示了如何在头文件和实现文件中定义和使用这个自定义对话框。
摘要由CSDN通过智能技术生成

首界面效果如图

界面就比较简单,拖拉几个控件,设置一下样式ok,不得不说QT这个QSS弄的还是可以,虽然明显是抄袭CSS,语法基本一样,但就是香,比微软那MFC好用太多了。

整个界面还增加了一个标题栏,以及窗体圆角边框和阴影效果,具体是实现方式为,定义了一个MDialog类,继承自QDialog,在MDialog里面,实现了圆角边框,阴影效果,使用绘图方式实现的。

新建一个Dialog,只要继承一下MDialog,就可以轻松实现。需要注意的是,ui文件里面也需要修改一下继承类,但是在QTCreater里面无法修改,因此需要用记事本打开ui文件,手动修改继承自MDiaolog类

 图的意思就是ui文件需要修改基类

MDialog.h源码

#include <QDialog>
#include "qlabel.h"
#include "qpushbutton.h"
#include "QPoint"
#include <QMouseEvent>

class MDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MDialog(QWidget *parent = 0);
    ~MDialog();
    void show();
protected:
    virtual void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
    //virtual void keyPressEvent(QKeyEvent *ev);
    void mouseMoveEvent(QMouseEvent* event);//鼠标移动事件
    void mousePressEvent(QMouseEvent* event);//鼠标按下事件
    void mouseReleaseEvent(QMouseEvent* event);//鼠标释放事件
    QPushButton *closeBtn;
private:

    QWidget * top;
    QLabel * title;

    QLabel *ico;//用来显示图标

    bool isPressed;
    QPoint old;//原始的点
    int x_nBorder;//边框
    QColor x_bgColor;//背景色
    int x_nRatio;//圆角率
    void drawBG(QPainter* painter);

    void drawShadow(QPainter* painter);
public slots:
    void doClose();
    void doMin();
    void doMenu();
public:
    void hideTitle();
    void hideMenu();
    void setTitle(QString title);//设置标题
    void hideMin();//隐藏最小化
    void hideClose();//隐藏关闭按钮
    void hideIcon();//隐藏图标

};

#endif // MFORM_H

MDialog.cpp源码

#include "mdialog.h"

#include "qpainter.h"
#include "QDebug"
#include <qmath.h>
#include <QApplication>
MDialog::MDialog(QWidget *parent) :
    QDialog(parent)
{
    //ui->setupUi(this);
    this->setAttribute(Qt::WA_TranslucentBackground);
    setWindowFlags(Qt::FramelessWindowHint| Qt::WindowStaysOnTopHint);

    x_nBorder = 5;
    x_bgColor = Qt::white;
    x_nRatio = 5;


    top=new QWidget(this);
    top->setStyleSheet("background:#333");
    top->resize(this->width()-10,40);
    top->move(x_nBorder,x_nBorder);
    title=new QLabel(top);
    title->setText("曲大家远程控制软件");
    title->setStyleSheet("color:#fff;");
    QFont ft("黑体",12,1);
    title->setFont(ft);
    title->move(40,10);
    closeBtn=new QPushButton(top);
    closeBtn->setStyleSheet("QPushButton{border:none;background:#f00 url(:/images/close.png) center no-repeat;}QPushButton::hover{background:#900 url(:/images/close.png) center no-repeat;}");
    closeBtn->resize(25,25);
    closeBtn->move(top->width()-32,10);
    QPixmap map(":/images/tlogo.png");
    map=map.scaled(24,24);
    ico=new QLabel(top);
    ico->setPixmap(map);
    ico->move(5,5);
    connect(closeBtn, SIGNAL(clicked()), this, SLOT(doClose()));//连接关闭事件

    this->setTitle("曲大家远程控制软件");
}

MDialog::~MDialog()
{

}
void MDialog::show(){

    setWindowState(Qt::WindowNoState);
    QDialog::show();

}

void MDialog::paintEvent(QPaintEvent *event)
{

        if(this->top!=NULL){//重置标题大小
             QRect rect = this->rect();
            top->resize(rect.width()-x_nBorder*2,38);

            closeBtn->move(top->width()-30,6);

        }

        QPainter painter(this);

            painter.setRenderHint(QPainter::Antialiasing);

            drawBG(&painter);

            drawShadow(&painter);



        QWidget::paintEvent(event);

}
void MDialog::drawBG(QPainter* painter)
{
    painter->save();
    QBrush brush(x_bgColor);
    painter->setBrush(brush);
    painter->setPen(Qt::NoPen);

    QRect _rect = this->rect();
    QRect _rectBG = QRect(_rect.x() + x_nBorder, _rect.y() + x_nBorder, _rect.width() - 2 * x_nBorder, _rect.height() - 2 * x_nBorder);

    painter->drawRoundedRect(_rectBG, x_nRatio, x_nRatio);
    painter->restore();
}

void MDialog::drawShadow(QPainter* painter)
{
    painter->save();

    QColor color(0, 0, 0, 0);

    for (int i = 0; i < x_nBorder; ++i)
    {
        QPainterPath path;
        path.setFillRule(Qt::WindingFill);

        path.addRoundedRect(x_nBorder - i, x_nBorder - i, this->width() - (x_nBorder - i) * 2, this->height() - (x_nBorder - i) * 2, x_nRatio, x_nRatio);

        color.setAlpha(100 - qSqrt(i) * 50);
        painter->setPen(color);
        painter->drawPath(path);
    }

    painter->restore();
}
void MDialog::hideTitle(){
    top->hide();
}
void MDialog::hideMin(){
    //minBtn->hide();
}
void MDialog::hideIcon(){
    ico->hide();
    title->move(10,10);
}
void MDialog::hideMenu(){
   // menuBtn->close();
}
void MDialog::hideClose(){
    closeBtn->hide();
}
void MDialog::setTitle(QString title)
{
   // echo("title="+title);
    this->setWindowTitle(title);
    this->title->setText(title);
}
void MDialog::doClose(){


   QApplication::exit();
}
void MDialog::doMenu(){

}
void MDialog::doMin(){

   setWindowState(Qt::WindowMinimized);
}
void MDialog::mousePressEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton && event->y()<=40)
    {
        isPressed = true;
        old = event->globalPos();
    }
}

void MDialog::mouseMoveEvent(QMouseEvent* event)
{
    if(isPressed && event->buttons().testFlag(Qt::LeftButton))
    {
        this->move(this->pos() + (event->globalPos() - old));
        old = event->globalPos();
    }
}

void MDialog::mouseReleaseEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        isPressed = false;
    }
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值