效果

#!/usr/bin/env python
# -*- coding: utf-8 -*-'''
Created on 2018年1月27日
@author: Irony."[讽刺]
@site: https://pyqt5.com , https://github.com/892768447
@email: 892768447@qq.com
@file: BubbleTips
@description:
'''
import sysfrom PyQt5.QtCore import QRectF, Qt, QPropertyAnimation, \QPoint, QParallelAnimationGroup, QEasingCurve, pyqtProperty
from PyQt5.QtGui import QPainter, QPainterPath, QColor, QPen
from PyQt5.QtWidgets import QLabel, QWidget, QVBoxLayout, QApplication,\QLineEdit, QPushButton__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
__Copyright__ = "Copyright (c) 2018 Irony.\"[讽刺]"
__Version__ = "Version 1.0"class BubbleLabel(QWidget):BackgroundColor = QColor(195, 195, 195)BorderColor = QColor(150, 150, 150)def __init__(self, *args, **kwargs):text = kwargs.pop("text", "")super(BubbleLabel, self).__init__(*args, **kwargs)# 设置无边框置顶self.setWindowFlags(Qt.Window | Qt.Tool | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.X11BypassWindowManagerHint)# 设置最小宽度和高度self.setMinimumWidth(200)self.setMinimumHeight(48)self.setAttribute(Qt.WA_TranslucentBackground, True)layout = QVBoxLayout(self)# 左上右下的边距(下方16是因为包括了三角形)layout.setContentsMargins(8, 8, 8, 16)self.label = QLabel(self)layout.addWidget(self.label)self.setText(text)# 获取屏幕高宽self._desktop = QApplication.instance().desktop()def setText(self, text):self.label.setText(text)def text(self):return self.label.text()def stop(self):self.hide()self.animationGroup.stop()self.close()def show(self):super(BubbleLabel, self).show()# 窗口开始位置startPos = QPoint(self._desktop.screenGeometry().width() - self.width() - 100,self._desktop.availableGeometry().height() - self.height())endPos = QPoint(self._desktop.screenGeometry().width() - self.width() - 100,self._desktop.availableGeometry().height() - self.height() * 3 - 5)print(startPos, endPos)self.move(startPos)# 初始化动画self.initAnimation(startPos, endPos)def initAnimation(self, startPos, endPos):# 透明度动画opacityAnimation = QPropertyAnimation(self, b"opacity")opacityAnimation.setStartValue(1.0)opacityAnimation.setEndValue(0.0)# 设置动画曲线opacityAnimation.setEasingCurve(QEasingCurve.InQuad)opacityAnimation.setDuration(4000)  # 在4秒的时间内完成# 往上移动动画moveAnimation = QPropertyAnimation(self, b"pos")moveAnimation.setStartValue(startPos)moveAnimation.setEndValue(endPos)moveAnimation.setEasingCurve(QEasingCurve.InQuad)moveAnimation.setDuration(5000)  # 在5秒的时间内完成# 并行动画组(目的是让上面的两个动画同时进行)self.animationGroup = QParallelAnimationGroup(self)self.animationGroup.addAnimation(opacityAnimation)self.animationGroup.addAnimation(moveAnimation)self.animationGroup.finished.connect(self.close)  # 动画结束时关闭窗口self.animationGroup.start()def paintEvent(self, event):super(BubbleLabel, self).paintEvent(event)painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)  # 抗锯齿rectPath = QPainterPath()  # 圆角矩形triPath = QPainterPath()  # 底部三角形height = self.height() - 8  # 往上偏移8rectPath.addRoundedRect(QRectF(0, 0, self.width(), height), 5, 5)x = self.width() / 5 * 4triPath.moveTo(x, height)  # 移动到底部横线4/5处# 画三角形triPath.lineTo(x + 6, height + 8)triPath.lineTo(x + 12, height)rectPath.addPath(triPath)  # 添加三角形到之前的矩形上# 边框画笔painter.setPen(QPen(self.BorderColor, 1, Qt.SolidLine,Qt.RoundCap, Qt.RoundJoin))# 背景画刷painter.setBrush(self.BackgroundColor)# 绘制形状painter.drawPath(rectPath)# 三角形底边绘制一条线保证颜色与背景一样painter.setPen(QPen(self.BackgroundColor, 1,Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))painter.drawLine(x, height, x + 12, height)def windowOpacity(self):return super(BubbleLabel, self).windowOpacity()def setWindowOpacity(self, opacity):super(BubbleLabel, self).setWindowOpacity(opacity)# 由于opacity属性不在QWidget中需要重新定义一个opacity = pyqtProperty(float, windowOpacity, setWindowOpacity)class TestWidget(QWidget):def __init__(self, *args, **kwargs):super(TestWidget, self).__init__(*args, **kwargs)layout = QVBoxLayout(self)self.msgEdit = QLineEdit(self, returnPressed=self.onMsgShow)self.msgButton = QPushButton("显示内容", self, clicked=self.onMsgShow)layout.addWidget(self.msgEdit)layout.addWidget(self.msgButton)def onMsgShow(self):msg = self.msgEdit.text().strip()if not msg:returnif hasattr(self, "_blabel"):self._blabel.stop()self._blabel.deleteLater()del self._blabelself._blabel = BubbleLabel()self._blabel.setText(msg)self._blabel.show()if __name__ == "__main__":app = QApplication(sys.argv)w = TestWidget()w.show()sys.exit(app.exec_())

效果

#!/usr/bin/env python
# -*- coding: utf-8 -*-import base64from PyQt5.QtCore import Qt, QRectF, QSize, pyqtSignal, QTimer
from PyQt5.QtGui import QPixmap, QImage, QPainter, QPainterPath,\QColor
from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout,\QGridLayout, QSpacerItem, QSizePolicy, QGraphicsDropShadowEffect,\QListWidget, QListWidgetItemclass NotificationIcon:Info, Success, Warning, Error, Close = range(5)Types = {Info: None,Success: None,Warning: None,Error: None,Close: None}@classmethoddef init(cls):cls.Types[cls.Info] = QPixmap(QImage.fromData(base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC5ElEQVRYR8VX0VHbQBB9e/bkN3QQU0FMBSEVYFcQ8xPBJLJ1FWAqOMcaxogfTAWQCiAVRKkgTgfmM4zRZu6QhGzL0p0nDPr17e7bt7tv14RX/uiV48MJgAon+8TiAMRtMFogaqUJxADPwRRzg67kl8+xbWJWANR40iPQSSFgtX/mGQkaDr56V3VAKgGos4s2JXwJoF3naMPvMS+SrpTHs032GwGkdF+DsFMVnJm/oyGGeHico0EjIjpYes+YMyVd6R/flfkpBWCCQ9zaZM2LZDfLMGXsZ5kdI/lYBmINgHHyyLd1mWdBbAFAM/GY7K2WYx1AeB4T6L1N9umbGxZ0qktATaEAdCps48D39oq/LwEw3U5CN92LfczJoewfT7MAywDCaEbAuxeLrh0zz4L+0e4aAJfGy+sP3IMxlH1vpMJoSMCJDXgWtJeJVc6ACs9HBBrYODCJAFdYvAmkPJxnNqMwYht7Bn+T/lGg3z4DGEd3RPhQ54DBvwAOVkeqagRXfTLjh+x7+8sALOtfHLuiYzWOAiLoKbD58mnIGbCmLxUepS6NQmYlUGE0JeCTTXT9JvA9E9sZgO5iIpoyc6/YzcqSwQzgGgBXB7oXpH9klpRSkxY1xW/b7Iu2zk34PILPnazCqEPAtTWA8iZ0HsOu9L0bw4DzCJeNocMGNDpQ3IKO+6NUiJ4ysZNiBv5I3zPnmJmG5oM+wbS+9+qkvGi7NAXGmeUy0ioofa+XA0jH0UaMKpdRWs/adcwMqfV/tenqpqHY/Znt+j2gJi00RUzA201dXaxh9iZdZloJS+9H1otrkbRrD5InFqpPskxEshJQ468CkSmJC+i1HigaaxCAuCljgoDhwPdOjf7rFVxxuJrMkXScjtKc1rOLNpJk6nii5XmYzbngzlZn+RIb40kPJPTBYXUt6VEDJ8Pi6bWpNFb/jFYY6YGpDeKdjBmTKdMcxDGEmP73v2a2Gr/NOycGtglQZ/MPzEqCMLGckJEAAAAASUVORK5CYII=')))cls.Types[cls.Success] = QPixmap(QImage.fromData(base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACZUlEQVRYR8VXS3LTQBDtVsDbcAPMCbB3limkcAKSG4QFdnaYE2BOQLKzxSLJCeAGSUQheSnfwLmB2VJhXmpExpFHI2sk2RWv5FJPv9evP9NieuIfPzE+VSJw8qt3IMDvmahDoDYxt2UAACXMWIIowR5ffn8TJbaBWRE4CXvHAH9RgKXOgQUI48CfXZbZbiTw8Xe/w3d0zkydMkem91IZpyWOJu5sUXS+kEAqt3B+MNOLOuDqDEBLxxFHk7eza5MfIwEJDjhXTYD1s8zinYlEjsCD7FdNI9cJpEq0RFdPR47AMOzLCn69zegz6UgCP+pmfa8RSKudnPNdgCufTOLDxJtdPP7PoA1Cd8HEL5sSUCCD0B0x8bc1f8Bi6sevcgS2VXh6hMOwDz0gsUddNaxWKRjeuKfE/KlJ9Dq4UYH/o/Ns6scj+bgiMAjdayb26xLQwTfVEwg3gRcf6ARq578KuLo7VDc8psCQqwfjr4EfjYvkrAquFJ56UYpdSkAZSmNd1rrg0leOQFELgvA58OJTxVyRaAJORPOpF6UXnFUR5sDiXjs7UqsOMGMRlrWhTkJXpFL3mNrQZhA1lH3F0TiI5FurUQyMpn58VjhkSqQA4Tbw4nSVW6sBU5VXktXSeONlJH3s8jrOVr9RgVSFuNcWfzlh5n3LoKzMAPxxWuiULiQpiR2sZNnCyzIuWUr5Z1Ml0sgdHFZaShVDuR86/0huL3VXtDk/F4e11vKsTHLSCeKx7bYkW80hjLOrV1GhWH0ZrSlyh2MwdZhYfi8oZeYgLBmUiGd8sfVPM6syr2lUSYGaGBuP3QN6rVUwYV/egwAAAABJRU5ErkJggg==')))cls.Types[cls.Warning] = QPixmap(QImage.fromData(base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACmElEQVRYR8VXTW7TUBD+xjYSXZFukOIsSE9AskNJJMoJmq4r7OYEwAkabhBOkB/Emt4gVIojdpgbpIumEitX6gKB7UHPkauXxLHfc4F6Z3l+vvnmm/fGhAd+6IHzQwvA9cfOITMfAdQAcx1EdVEAM/tEFADsWyaPn57MfdXClABcT1qnzHSWJiwMzrwgoF91vXGRbS6AH59ajd8hDYmoURQo67tgxoij42rv62KX/04Agu44xmciVMokT32YERgGjquvZ1+y4mQCWPUa0/sk3vQlwqssEFsAVrQbU4XKL/ai2+5PPK6waQ4AOsoDnDARh83NdmwBuJq0fQI9L6p+L7rd3+/5gbAToMPI+FbkIzRRc72mbLcGIFE7jGFRIPHddmZrvstJh1X8CHGv6sxHqe1GkPYCoGcqgcoCAPPCdr2DLQC6wqMoPEj7qdqCNKllxs30sLpjYDluDUDGG5XqhY2sal3w4PiD7c7fJnHShMtJR8zpy/8CALiwndnhBgD1/t+XAXkaZAaUVHwnHulg0W6BNEWlAQD8zna8gQB0Ne70iXCm2j55jCUAei1gxvuaO+uXAcDg7zXHSy640iKUAehOEDJFqDmGQkiPLO5Fv+KADXOqvCuIsrPGsIyQdHou22YeRMJgOdHTQTkAfGk7XrLKrWlAvOhcRgBfWiZ3RQti0zxXuUFXCXMuo0TRitfxugjbIxC5RYzI6s9kIGFh+KLOpiW22id5AUuI8IaisFG4kCQg/sFKJgtPLix3KWXGeRETRbQDuCFCV2spTYMm+2FEI1WBbYIRPTeiqFtqLZeDraaD+qrbkpgQAvfl1WsXU0p/RjIjYYhTkNFgcCVlRlRKoAAc+5aF0V//NVPoc2kTLQZKZ8lx/AMXBmMwuXUwOAAAAABJRU5ErkJggg==')))cls.Types[cls.Error] = QPixmap(QImage.fromData(base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACrklEQVRYR82XW27aQBSG/4PtiNhIpStouoImKwjZAV1B07coWCpZQcgK6kh2lLeSFZSsIOwgdAdkBaUSEBQDpxpjU9vM+EJR03nDzJz/mzm3GcIrD3plfZQCeD47O1ho2jERNRmoE9AQG2BgBGBAwIiZe5Zh3JPjiG+5oxCAEF5q2iWITnMtRhOYu5XF4mr/9naYtSYXYGLbHQCXhYVTEwlom657rVqvBOB2uz71/a+ldq1SYe6ahnEhc4sSYGzbfQKOt915eh0D/ZrrnqS/SwEmrVYXRJ92Jb4OC+C65rrtuN0NgIltNwF837V4zN5Hy3V70e9NgFZrCKJ3CQDmJ9MwDsW36XzeB/AhA/CHqeuN2WxWX2paX2JraHneeynA+Pz8lCqVbxLjV5brimxAEJxqiEA8CjZVBvFy+bl2c9MV9hInoAw85qFpGEeRYQVEQjzMokcQHWxsiPne8jzh6j8AodGfyqNlHpiGcaKAkIk/gChwm2yYuv5W2FqfwLNtN5bAQ2bwySB83zENo50A8/1McaFRAU72XVek+mpk+D/JlIKI/xkee654uCbIhjVAqZIrgSgpLhiCwN4OAEj4vEB2yDybBCjsAol4ZD0nRdMQSRcUCsKUeNSw4o2mKMRGEOamoVx8FXDZKVosDYNMUHXAsBRnppo8RQcbpTgIGEkhykpFjnWxzGhPQYxt2yHgS/oIlKVYTJxImpG482nz+VG1Wh1N84pMCCGa0ULXHwmoJwCYnyzPW5fn/68dh7EgPbrMMl3gz7gro+n/7EoWD7w4a96l1NnJ1Yz5Lt6wCgFEk0r1CIkbiPnC9DxH5aHcd4FYGD5MOqVOg/muslh0/vphkm63k5eXZvA0I6qD+ZCI3jDzLxANiHn1NNvb6+30aVYgwLeeUsgFW1svsPA3Ncq4MHzVeO8AAAAASUVORK5CYII=')))cls.Types[cls.Close] = QPixmap(QImage.fromData(base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAeElEQVQ4T2NkoBAwUqifgboGzJy76AIjE3NCWmL0BWwumzV/qcH/f38XpCfHGcDkUVwAUsDw9+8GBmbmAHRDcMlheAGbQnwGYw0DZA1gp+JwFUgKZyDCDQGpwuIlrGGAHHAUGUCRFygKRIqjkeKERE6+oG5eIMcFAOqSchGwiKKAAAAAAElFTkSuQmCC')))@classmethoddef icon(cls, ntype):return cls.Types.get(ntype)class NotificationItem(QWidget):closed = pyqtSignal(QListWidgetItem)def __init__(self, title, message, item, *args, ntype=0, callback=None, **kwargs):super(NotificationItem, self).__init__(*args, **kwargs)self.item = itemself.callback = callbacklayout = QHBoxLayout(self, spacing=0)layout.setContentsMargins(0, 0, 0, 0)self.bgWidget = QWidget(self)  # 背景控件, 用于支持动画效果layout.addWidget(self.bgWidget)layout = QGridLayout(self.bgWidget)layout.setHorizontalSpacing(15)layout.setVerticalSpacing(10)# 标题左边图标layout.addWidget(QLabel(self, pixmap=NotificationIcon.icon(ntype)), 0, 0)# 标题self.labelTitle = QLabel(title, self)font = self.labelTitle.font()font.setBold(True)font.setPixelSize(22)self.labelTitle.setFont(font)# 关闭按钮self.labelClose = QLabel(self, cursor=Qt.PointingHandCursor, pixmap=NotificationIcon.icon(NotificationIcon.Close))# 消息内容self.labelMessage = QLabel(message, self, cursor=Qt.PointingHandCursor, wordWrap=True, alignment=Qt.AlignLeft | Qt.AlignTop)font = self.labelMessage.font()font.setPixelSize(20)self.labelMessage.setFont(font)self.labelMessage.adjustSize()# 添加到布局layout.addWidget(self.labelTitle, 0, 1)layout.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 0, 2)layout.addWidget(self.labelClose, 0, 3)layout.addWidget(self.labelMessage, 1, 1, 1, 2)# 边框阴影effect = QGraphicsDropShadowEffect(self)effect.setBlurRadius(12)effect.setColor(QColor(0, 0, 0, 25))effect.setOffset(0, 2)self.setGraphicsEffect(effect)self.adjustSize()# 5秒自动关闭self._timer = QTimer(self, timeout=self.doClose)self._timer.setSingleShot(True)  # 只触发一次self._timer.start(5000)def doClose(self):try:# 可能由于手动点击导致item已经被删除了self.closed.emit(self.item)except:passdef showAnimation(self, width):# 显示动画passdef closeAnimation(self):# 关闭动画passdef mousePressEvent(self, event):super(NotificationItem, self).mousePressEvent(event)w = self.childAt(event.pos())if not w:returnif w == self.labelClose:  # 点击关闭图标# 先尝试停止计时器self._timer.stop()self.closed.emit(self.item)elif w == self.labelMessage and self.callback and callable(self.callback):# 点击消息内容self._timer.stop()self.closed.emit(self.item)self.callback()  # 回调def paintEvent(self, event):# 圆角以及背景色super(NotificationItem, self).paintEvent(event)painter = QPainter(self)path = QPainterPath()path.addRoundedRect(QRectF(self.rect()), 6, 6)painter.fillPath(path, Qt.white)class NotificationWindow(QListWidget):_instance = Nonedef __init__(self, *args, **kwargs):super(NotificationWindow, self).__init__(*args, **kwargs)self.setSpacing(20)self.setMinimumWidth(412)self.setMaximumWidth(412)QApplication.instance().setQuitOnLastWindowClosed(True)# 隐藏任务栏,无边框,置顶等self.setWindowFlags(self.windowFlags() | Qt.Tool |Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)# 去掉窗口边框self.setFrameShape(self.NoFrame)# 背景透明self.viewport().setAutoFillBackground(False)self.setAttribute(Qt.WA_TranslucentBackground, True)# 不显示滚动条self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)# 获取屏幕高宽rect = QApplication.instance().desktop().availableGeometry(self)self.setMinimumHeight(rect.height())self.setMaximumHeight(rect.height())self.move(rect.width() - self.minimumWidth() - 18, 0)def removeItem(self, item):# 删除itemw = self.itemWidget(item)self.removeItemWidget(item)item = self.takeItem(self.indexFromItem(item).row())w.close()w.deleteLater()del item@classmethoddef _createInstance(cls):# 创建实例if not cls._instance:cls._instance = NotificationWindow()cls._instance.show()NotificationIcon.init()@classmethoddef info(cls, title, message, callback=None):cls._createInstance()item = QListWidgetItem(cls._instance)w = NotificationItem(title, message, item, cls._instance,ntype=NotificationIcon.Info, callback=callback)w.closed.connect(cls._instance.removeItem)item.setSizeHint(QSize(cls._instance.width() -cls._instance.spacing(), w.height()))cls._instance.setItemWidget(item, w)@classmethoddef success(cls, title, message, callback=None):cls._createInstance()item = QListWidgetItem(cls._instance)w = NotificationItem(title, message, item, cls._instance,ntype=NotificationIcon.Success, callback=callback)w.closed.connect(cls._instance.removeItem)item.setSizeHint(QSize(cls._instance.width() -cls._instance.spacing(), w.height()))cls._instance.setItemWidget(item, w)@classmethoddef warning(cls, title, message, callback=None):cls._createInstance()item = QListWidgetItem(cls._instance)w = NotificationItem(title, message, item, cls._instance,ntype=NotificationIcon.Warning, callback=callback)w.closed.connect(cls._instance.removeItem)item.setSizeHint(QSize(cls._instance.width() -cls._instance.spacing(), w.height()))cls._instance.setItemWidget(item, w)@classmethoddef error(cls, title, message, callback=None):cls._createInstance()item = QListWidgetItem(cls._instance)w = NotificationItem(title, message, item,ntype=NotificationIcon.Error, callback=callback)w.closed.connect(cls._instance.removeItem)width = cls._instance.width() - cls._instance.spacing()item.setSizeHint(QSize(width, w.height()))cls._instance.setItemWidget(item, w)if __name__ == '__main__':import sysimport cgitbsys.excepthook = cgitb.Hook(1, None, 5, sys.stderr, 'text')from PyQt5.QtWidgets import QApplication, QPushButtonapp = QApplication(sys.argv)w = QWidget()layout = QHBoxLayout(w)def callback():print('回调点击')layout.addWidget(QPushButton('Info', w, clicked=lambda: NotificationWindow.info('提示', '这是一条会自动关闭的消息', callback=callback)))layout.addWidget(QPushButton('Success', w, clicked=lambda: NotificationWindow.success('提示', '这是一条会自动关闭的消息', callback=callback)))layout.addWidget(QPushButton('Warning', w, clicked=lambda: NotificationWindow.warning('提示','这是提示文案这是提示文案这是提示文案这是提示文案。',callback=callback)))layout.addWidget(QPushButton('Error', w, clicked=lambda: NotificationWindow.error('提示','<html><head/><body><p><span style=" font-style:italic; color:teal;">这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案</span></p></body></html>',callback=callback)))w.show()#     NotificationIcon.init()
#     ww = NotificationItem('提示', '<html><head/><body><p><span style=" font-style:italic; color:teal;">这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案</span></p></body></html>', None,
#                           ntype=NotificationIcon.Error)
#     ww.bgWidget.setVisible(True)
#     ww.show()sys.exit(app.exec_())

PyQt设置右下角弹窗(转)相关推荐

  1. python右下角弹窗_python+pyqt实现右下角弹出框

    本文实例为大家分享了pyqt实现右下角弹出框的具体代码,供大家参考,具体内容如下 构造函数中: self.desktop=QDesktopWidget() self.move((self.deskto ...

  2. python任务栏通知区域_python+pyqt实现右下角弹出框

    本文实例为大家分享了pyqt实现右下角弹出框的具体代码,供大家参考,具体内容如下 构造函数中: self.desktop=QDesktopWidget() self.move((self.deskto ...

  3. php 右下脚弹窗,纯js的右下角弹窗实例代码

    下面小编就为大家带来一篇纯js的右下角弹窗实例代码.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 这个弹窗是如下图的效果: 打开网页的时候,这个弹窗会淡入,之后点击右上 ...

  4. 【jQuery】纯js的右下角弹窗

    这个弹窗是如下图的效果: 打开网页的时候,这个弹窗会淡入,之后点击右上角的关闭按钮,其实就是一个& times;会淡出. 采用淡入淡出是因为直接Jquery一个fadeIn与fadeOut省事 ...

  5. QML实现桌面右下角弹窗

    实现效果 这次制作的桌面右下角弹窗,主要功能有透明度和位置动画.定时关闭.鼠标放在上面暂留. 实现思路 首先,我们需要获取桌面大小,然后 move 到右下角去,这里借助的 Screen: //初始位置 ...

  6. MFC 右下角弹窗显示关闭实例

    效果类似于下测: 弹窗会在一定时间之后自动关闭,点击内容或者下测的[查看]会自动打开某个设置的网站 代码如下所示: void OnBnClickedButton1() {     CMsgWindow ...

  7. 精仿 QQ 右下角弹窗 / 广告

    VC编写,带原版通知声音,可二次开发,100%一模一样. 1.当前版本仅支持单个广告弹出展示. 2.程序经过反复测试,目前能十分稳定地在目标机器右下角位置弹出所指定的广告. 3.百分百精仿,无论样式. ...

  8. 关于Potplayer右下角弹窗解决方案

    关于Potplayer右下角弹窗解决方案 Potplayer,是KMPlayer的原作者姜勇囍進入Daum公司后的新一代作品,优点很多. 之前使用的是同作者的KMplayer,可惜被收购后因为广告太多 ...

  9. 仿QQ右下角弹窗新闻_源码分享

    源码名称:仿QQ右下角弹窗新闻 源码作者:邓学彬(泪闯天涯) 开发环境:Visual Studio 2005  源码说明:Win32(SDK)开发,自绘实现,支持多种皮肤风格.无需其他界面库. 美中不 ...

  10. Qt4.8.2 模仿QQ右下角弹窗提示

    今天在CSDN偶然看到一位前辈用JAVA写的QQ右下角弹窗提示,而自己正在学习Qt,所以也自己试着写一下,虽然代码乱的一塌糊涂,但最后还是能够运行了. 程序最终运行: 输入内容并点击确定的时候,从右下 ...

最新文章

  1. php-fpm定义成集群资源时报错解决方法
  2. awk 分隔符_awk 中的字段、记录和变量 | Linux 中国
  3. eclips 的pydev的debug
  4. 飞哥:程序员完全没时间提升自己该怎么办?
  5. 2015美国数学建模a代码c语言,1985~2015美国大学生数学建模竞赛题目集锦.docx
  6. Python窗体操作函数
  7. 西安高铁“洋班组” 助力新春运
  8. 【C++】演讲比赛流程管理系统
  9. r语言ggplot画两条曲线_如何用R语言绘制生存曲线?
  10. 高效记忆/形象记忆(06)110数字编码表 01-10
  11. .Net Framework 中设置Web Proxy 的方法
  12. 5款高质量app界面ui设计实例欣赏
  13. python_you-get下载B站视频详解
  14. [抄袭]年薪五万程序员的生活及他的理财梦
  15. 数据仓库之搭建ODS(原始数据层)
  16. 学Python兼职赚钱是真的吗
  17. GTD时间管理:高效管理你的时间,GTD软件一款就够
  18. 培训:3天带你快速上手Kubernetes | 上海站
  19. DHU数据结构-单链表-ADT应用-长整数加法运算(使用单链表存储计算结果)
  20. OpenGL,glx,glaux,glut,freeglut,glew,glfw,mesa

热门文章

  1. JAVA-银行卡归属地查询
  2. 变限积分求导公式总结_变限积分求导的口诀记忆法及应用
  3. 局域网网络流量监控_网工必知:用于监控企业网络的10款最佳工具,拿走!不谢...
  4. 软件测试基本技术-XMind思维导图(全)
  5. python中label组件参数_【Python64-tkinter_label组件】
  6. 全国大学生大数据技能竞赛比赛心得以及相关资料
  7. JVM底层原理分析 + 性能调优
  8. Bootstrap响应式图表设计
  9. 单片机位寻址举例_51单片机直接寻址方式与编程举例
  10. Linux里怎么打开pt文件,在 Linux 上安装 transmission 进行远程 PT 下载