首页 > 其他分享 >Qt异形窗口例子

Qt异形窗口例子

时间:2024-02-01 09:01:55浏览次数:31  
标签:窗口 Qt 异形 msec MBalloonTip const tips painter

这个原理简单,就是调用QWidget::setMask(...)设置窗口的掩膜实现异形窗口。下面的代码环境是VS2015和Qt5.9。其运行效果图如下,就是下图中显示“显示气球控件”文本的窗口:

头文件:

class MBalloonTip : public QWidget
{
    Q_OBJECT

public:
    static void showText(const QPoint& pos, const QString& itext, int msec = 5000);
    static void showText(QWidget* widget, const QString& itext, int msec = 5000);

private:
    MBalloonTip(QWidget* parent = 0);
    ~MBalloonTip();
    void paintEvent(QPaintEvent *event) override;
    QBitmap raiseShape();
    void setAutoCloseTimer(int msec);

private:
    static const QPoint hotspot;
    QBitmap bitmap;
    QString text;
};

CPP文件。下方将窗口设为Popup型的,这个类型的窗口没有边框并且失去活动焦点会自动关闭:

const QPoint MBalloonTip::hotspot(30, 0);

MBalloonTip::MBalloonTip(QWidget* parent) : 
    QWidget(parent)
{
    setWindowFlags(Qt::Popup | Qt::WindowStaysOnTopHint);
    setAttribute(Qt::WA_DeleteOnClose);
}

MBalloonTip::~MBalloonTip()
{
    qDebug() << "delete";
}

void MBalloonTip::showText(QWidget* widget, const QString& itext, int msec)
{
    QSize size = widget->size();
    QPoint pos = widget->mapToGlobal(QPoint(size.width() / 2, size.height()));
    showText(pos, itext, msec);
}

void MBalloonTip::showText(const QPoint& pos, const QString& itext, int msec)
{
    MBalloonTip *tips = new MBalloonTip;
    tips->text = itext;
    QFontMetrics fm = tips->fontMetrics();
    QSize sz = fm.size(0, itext);
    sz.setWidth(qMax(sz.width(), 48)); /* 最小宽度48 */
    /* 尺寸之宽高。宽边距18,高边距18加上上方箭头13像素 */
    tips->setGeometry(pos.x() - hotspot.x(), pos.y() - hotspot.y(), sz.width() + 18, sz.height() + 31);
    tips->bitmap = tips->raiseShape();
    tips->setMask(tips->bitmap);     /* 这个掩膜是白色隐藏黑色显示 */
    tips->show();
    /* 自动关闭 */
    tips->setAutoCloseTimer(msec);
}

void MBalloonTip::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(QPen(Qt::black, 1));
    painter.setBrush(QColor(255, 255, 232));
    QPainterPath ppath1;
    /* 之所以是14为了跟content矩形相交 */
    /* content矩形的上边y轴坐标是13 */
    QVector<QPointF> points = { { 30, 0 },{ 30, 14 },{ 44, 14 } };
    ppath1.addPolygon(points);
    QPainterPath ppath2;
    QRectF content(0, 13, width(), height() - 13);
    ppath2.addRoundedRect(content, 6, 6);
    painter.drawPath(ppath1 | ppath2);

    painter.setPen(Qt::black);
    painter.setBrush(Qt::NoBrush);
    painter.drawText(content, Qt::AlignCenter, text);
}

void MBalloonTip::setAutoCloseTimer(int msec)
{
    /* 定时关闭窗口 */
    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [this]() { close(); });
    timer->setInterval(msec);
    timer->start();
}

QBitmap MBalloonTip::raiseShape()
{
    QBitmap bitmap(size());
    bitmap.fill(Qt::white);
    QPainter painter(&bitmap);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::black);
    const QPointF points[] = { { 30, 0 }, { 30, 14 }, { 44, 14 } };
    painter.drawPolygon(points, 3);
    QRectF rectangle(0, 13, width(), height() - 13);
    painter.drawRoundedRect(rectangle, 6, 6);
    return bitmap;
}

 

标签:窗口,Qt,异形,msec,MBalloonTip,const,tips,painter
From: https://www.cnblogs.com/mengxiangdu/p/17894390.html

相关文章

  • Qt QPushButton 点击信号分析
    QPushButton有三个很重要的信号跟点击有关pressedclickedtoggled表面上看,pressed和clicked都会在点击按钮时触发,它们有什么区别呢?toggled好像有时候触发,有时候不触发,到底怎么回事呢?下面就一起聊一下这三个信号首先,这三个信号都是从QAbstractButton继承来的,也就是说,下面情......
  • 使用 PyQt5(PySide2)+SQLAlchemy 做一个登录注册页(一)
    使用PyQt5(PySide2)+SQLAlchemy做一个登录注册页(一)本文将介绍自己用PyQt5+SQLAlchemy做的一个登录注册页,使用邮箱接收验证码,本文介绍是前后端未分离的实现方式,后续将出一个前后端分离的,你可以将PyQt5改为PySide2以获得更宽松的开源协议本文由于涉及到的代码较多,将会是......
  • [word] word打印窗口也可以进行页面设置,无需重新进入Word中设置
    在打印Word文档的过程中,我们一般要预览一下。在预览的过程中,如果发现了问题,一般要重新回到word文档中修改。实际上不需要,在打印窗口中可以直接修改。1.点击【文件】2.点击【打印】......
  • Qt VS环境 Designer 没有“转到槽”项
    在VS环境下进行QT编程时,QTDesigner没有“转到槽”选项,比较蛮烦。原因:“转到槽”是QTCreater的功能,QTDesigner下,可通过如下方式实现:......
  • sql之窗口函数详解
    官方地址https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html窗口函数:也可以被称为OLAP函数或分析函数。窗口......
  • Visual Studio进行Qt开发时Qt Designer没有“转到槽”选项的问题
    问题描述:在使用QtCreator进行界面设计时,只需要在控件上右击便会出现“转到槽”选项,从而可以进行槽函数的编写与槽函数和信号的自动连接,十分方便。但在使用VS进行Qt开发时,QtDesigner没有这个选项。解决方法:1.自己定义信号和槽并手工连接:qvtk_demo.h:1#pragmaonce2......
  • 运行bat的情况下,会弹出cmd的黑色窗口。怎么把这个窗口隐藏或者在后台运行
    为了在运行批处理文件(.bat)时隐藏或在后台运行CMD窗口,您可以使用Windows的VBScript来调用这个批处理文件。VBScript可以创建一个无窗口的WScript.Shell对象来运行您的批处理文件,从而避免显示命令提示符窗口。步骤创建VBScript文件:打开记事本或任何文本编辑器。将以下代......
  • Visual Studio 2015+Qt编程,如何使用qDebug()打印出信息
    问题:VisualStudio2015+Qt编程,调试程序的时候,使用qDebug()发现在vs的输出界面没有打印出qDebug()的信息。找到了最容易的解决办法(此方法只可以解决此解决方案的):1.项目文件名那里鼠标右键,点击属性,打开属性页 2.找到连接器->系统->子系统 3.将子系统由窗口改为控制台,点击......
  • Visual Studio 2022 + Qt 中文乱码问题
    使用Qt编译中文标题出现乱码问题如下图首先打开文件属性->点击(C/C++)->点击(所有选项)->找到(附加选项)这一栏修改为(/UTF-8)注意大小写  然后在头文件中添加以下代码:1#if_MSC_VER>=16002#pragmaexecution_character_set("utf-8")3#endif即可解决问题......
  • SciTech-CG-Graphics-Chart-CodeGenerator-PyQtGraph: 基于PyQt的图形绘制以及应用库
    UMLclassdiagram:https://pyqtgraph.readthedocs.io/en/latest/api_reference/uml_overview.htmlFlowChart:https://pyqtgraph.readthedocs.io/en/latest/api_reference/flowchart/index.htmlTheStateMachineFramework¶:https://doc.qt.io/qtforpython-5/overviews/......