QT自定义MainWindow

1.开发环境:Qt 4.7.3 + MinGW 32bit (MSVC2015 32bit)

2.实现大纲:

          1)自定义边框,标题栏,工具栏,内容栏,状态栏(后面三个代码中没有实现实现)

          2)重写鼠标事件来控制可以自由移动框体

          3)样式文件使用qss实现,UI设计/数据/控制分离,方便二次开发

3.具体实现:

        1)通常情况下,linux或者window系统下的QMainwindow的边框样式比较原始不太美观,Qt提供了可以舍弃原有的边框,然后自定义。具体设置参数如下:

    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);   //配置边框属性,无边框
    setAttribute(Qt::WA_TranslucentBackground);    //设置背景半透明    

         2)关于框体中框线的样式设计,可以采用添加QFrame组件,通过设计QFrame的border相关属性来设置边框线,但是在设计的过程中发现,如果直接添加在mainwindow中添加QFrame组件,然后再设置border属性,发现border属性无效。解决方案可以在QMainwindow和QFrame之间添加一个QWidget作为“画布”,来显示QFrame的边框样式。

        3)一般来说,window的标题栏一般包括图标,标题大纲,隐藏/放大/还原/关闭等组件,因此可以添加一个QFrame + QHBoxLayout来配合实现,另外按钮推荐使用QToolButton(使用QPushButton也可以,但是需要设置setAutoDefault为false,否则会在设计Dialog弹框事埋下隐藏的bug,即关于enter按键的响应问题),并且设置其hover属性和tooltip(悬放时提示按钮功能)等属性。

       4)接下来需要重新定义鼠标的事件来实现鼠标拖拽mainwindow功能,主要是关于系统的四个函数的复写,通过坐标的决定坐标globalPos()和相对坐标pos()直接的变换来记录移动的距离,从而实现窗体的移动,具体如下:

    void mouseReleaseEvent(QMouseEvent *event);   //鼠标左键释放
    void mouseMoveEvent(QMouseEvent *event);      //鼠标左键一直按着,系统提供了event->buttons()来专门判断是否按着
    void mousePressEvent(QMouseEvent *event);             //鼠标左键按下, 且按下的坐标在标题栏上
    void mouseDoubleClickEvent(QMouseEvent *event);      //双击事件也就是完成标题栏上的放大按钮的相关功能

 

4.具体代码见下载地址:https://download.csdn.net/my/uploads

5.实现截图:

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过继承 QProgressBar 类并重新实现绘制函数来自定义 Qt 进度条。 以下是一个示例代码: ```cpp #include <QtWidgets> class CustomProgressBar : public QProgressBar { public: explicit CustomProgressBar(QWidget* parent = nullptr) : QProgressBar(parent) { setMinimum(0); setMaximum(100); } protected: void paintEvent(QPaintEvent* event) override { QPainter painter(this); // 绘制背景 painter.fillRect(rect(), Qt::white); // 绘制进度条 int progressWidth = static_cast<int>(rect().width() * static_cast<double>(value()) / maximum()); QRect progressRect(rect().topLeft(), QSize(progressWidth, rect().height())); painter.fillRect(progressRect, Qt::blue); // 绘制文本 QString text = QString::number(value()) + "%"; painter.setPen(Qt::black); painter.drawText(rect(), Qt::AlignCenter, text); } }; int main(int argc, char** argv) { QApplication app(argc, argv); QMainWindow mainWindow; QWidget* centralWidget = new QWidget(&mainWindow); QVBoxLayout* layout = new QVBoxLayout(centralWidget); CustomProgressBar* progressBar = new CustomProgressBar(&mainWindow); progressBar->setValue(50); layout->addWidget(progressBar); mainWindow.setCentralWidget(centralWidget); mainWindow.show(); return app.exec(); } ``` 在此示例中,我们创建了一个名为 `CustomProgressBar` 的自定义进度条类。我们重新实现了 `paintEvent` 函数来绘制自己的进度条样式。在这个示例中,我们使用白色作为背景,蓝色作为进度条的颜色,并在进度条上方绘制了当前的进度文本。 您可以根据自己的需求修改绘制函数以实现您想要的效果。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值