天道酬勤,学无止境

How to make QToolTip message persistent?

I want to make a qtooltip message persistent after I clicked the button. I plan to use qtimer to hide it by myself later, but the problem is as soon as I move mouse cursor away from the button rect, the message disappears, I want to make it stay there, until later I call hideText()

from PyQt4 import QtGui, QtCore
from functools import partial

class MyDialog(QtGui.QDialog):

    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        layout = QtGui.QVBoxLayout()
        btn = QtGui.QPushButton('Push Me')
        layout.addWidget(btn)
        self.setLayout(layout)

        btn.clicked.connect(partial(self.showFloatingMessage,'This is a long message'))

    def showFloatingMessage(self, message='', delay=500):

        desktop = QtGui.QApplication.desktop()
        screen_num = desktop.screenNumber(QtGui.QCursor.pos())
        screen_rect = desktop.screenGeometry(screen_num)
        QtGui.QToolTip.showText(screen_rect.center(), message, None, screen_rect)


app = QtGui.QApplication([])

dialog = MyDialog()
dialog.show()

app.exec_()

评论

A possible solution is to use a QLabel as QToolTip, we do this by enabling the Qt.ToolTip flag. In your case:

from PyQt4 import QtGui, QtCore


class MyDialog(QtGui.QDialog):

    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        layout = QtGui.QVBoxLayout()
        btn = QtGui.QPushButton('Push Me')
        layout.addWidget(btn)
        self.setLayout(layout)

        btn.clicked.connect(lambda: self.showFloatingMessage('This is a long message', 5000))

    def showFloatingMessage(self, message='', delay=500):
        desktop = QtGui.QApplication.desktop()
        screen_num = desktop.screenNumber(QtGui.QCursor.pos())
        screen_rect = desktop.screenGeometry(screen_num)

        lb = QtGui.QLabel(self)
        lb.setWindowFlags(QtCore.Qt.ToolTip)
        lb.setText(message)
        lb.move(screen_rect.center())
        lb.show()
        QtCore.QTimer.singleShot(delay, lb.hide)


app = QtGui.QApplication([])

dialog = MyDialog()
dialog.show()

app.exec_()

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在 QToolTip 中使用图片或图像(Use a picture or image in a QToolTip)
    问题 有没有办法在 QToolTip 中显示图片/图像? 我想显示键盘按钮的小图像,以向用户解释他可以在该特定小部件上使用哪些按钮/快捷方式。 回答1 您可以使用以下 html 代码轻松显示图像: QToolTip::showText(QCursor::pos(), "<img src=':/icon.png'>Message", this, QRect(), 5000); 此示例将显示带有来自 Qt 资源的图像和文本的工具提示 5 秒钟。 更多详情,你可以看这个视频:https://youtu.be/X9JD8gKGZ00 编辑1: 如果你想从内存中显示图像,你可以将 QImage/QPixmap 保存到内存中(最好使用一些无损压缩,如 PNG)并将其转换为 base 64 并使用 html 代码加载它,如下所示: QImage icon = QImage(10, 10, QImage::Format_ARGB32); icon.fill(QColor(255, 0, 0, 100)); QByteArray data; QBuffer buffer(&data); icon.save(&buffer, "PNG", 100); QString html = QString("<img src='data:image/png;base64, %0'>Message").arg
  • 如何用CSS和QT绕过QToolTip角落(How to round QToolTip corners with CSS and QT)
    问题 请发布一些工作示例。 下面的边框有两个边框:黑色的矩形背景框架和带有圆角的白色轮廓。 我不敢相信它以前没有做过。 app.setStyleSheet("QToolTip { font-size:9pt; color:white; padding:2px; border-width:2px; border-style:solid; border-radius:20px; background-color: black; border: 1px solid white;}") 回答1 解决方案是在工具提示小部件上设置自定义蒙版。 我可以想到两种方法: 实现自己的QStyle,并为QStyle :: SH_ToolTip_Mask样式提示返回一个掩码。 这是一种通用方法,因为默认的QToolTip将使用此掩码(示例)。 创建一个具有适当掩码的基于QToolTip的自定义类,然后使用小部件的QHelpEvent(QEvent :: ToolTip)事件进行显示。 这不是通用解决方案,因为它需要过滤所有需要自定义工具提示的小部件上的事件。
  • How to round QToolTip corners with CSS and QT
    Please post some working example. The one below makes two borders: the rectangular background frame in black and a white outline with rounded edge. I can't believe it has not been done before. app.setStyleSheet("QToolTip { font-size:9pt; color:white; padding:2px; border-width:2px; border-style:solid; border-radius:20px; background-color: black; border: 1px solid white;}")
  • PyQt5用户GUI制作(初识pyqt5)
    PyQt5介绍 pyqt5是一套Python绑定Digia QT5应用的框架。它可用于Python 2和3。本教程使用Python 3。Qt库是最强大的GUI库之一。pyqt5的官方网站http://www.riverbankcomputing.co.uk/news。 pyqt5的类别分为几个模块,包括以下: QtCoreQtGuiQtWidgetsQtMultimediaQtBluetoothQtNetworkQtPositioningEnginioQtWebSocketsQtWebKitQtWebKitWidgetsQtXmlQtSvgQtSqlQtTest QtCore:包含了核心的非GUI功能。此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程。 QtGui包含类窗口系统集成、事件处理、二维图形、基本成像、字体和文本。 qtwidgets模块包含创造经典桌面风格的用户界面提供了一套UI元素的类。 QtMultimedia包含的类来处理多媒体内容和API来访问相机和收音机的功能。 Qtbluetooth模块包含类的扫描设备和连接并与他们互动。描述模块包含了网络编程的类。这些类便于TCP和IP和UDP客户端和服务器的编码,使网络编程更容易和更便携。 Qtpositioning包含类的利用各种可能的来源,确定位置,包括卫星、Wi-Fi
  • QT - How to apply a QToolTip on a QLineEdit
    On a dialog I have a QLineEdit and a button. I want to enable a tool tip for the QLineEdit(in it or under it) when I press the button. Please give me a code snippet.
  • Python界面编程第五课:Pyside2 (Qt For Python)怎么创建控件提示Tooltip
    先上代码: from PySide2.QtWidgets import QApplication, QWidget, QLabel, QToolTip import sys from PySide2.QtGui import QIcon, QPixmap, QFont class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Icon Modes") self.setGeometry(300,300, 500,400) QToolTip.setFont(QFont("Decorative", 10, QFont.Bold)) self.setToolTip('Our Main Window') def setIcon(self): appIcon = QIcon("wan.ico") self.setWindowIcon(appIcon) def setIconModes(self): icon1 = QIcon("wan.ico") label1 = QLabel('Sample', self) pixmap1 = icon1.pixmap(100,100, QIcon.Active, QIcon.On) label1.setPixmap(pixmap1) label1
  • Python PyQt5 QMessageBox 未打开(Python PyQt5 QMessageBox not opening)
    问题 I am trying to open a Message Box when I press the infoButton. It runs the infoDialogue method because it prints "I'm here" but it doesn't open the infoBox. What I'm missing? I'm using python 3.5 with PyQt5 Thanks! Here's the code: import sys from PyQt5.QtWidgets import (QApplication, QWidget, QToolTip, QPushButton, QMessageBox) from PyQt5.QtCore import QCoreApplication from PyQt5.QtGui import QIcon, QFont class mainWindow(QWidget): def __init__(self, screenWidth, screenHeight, windowWidth=400, windowHeight=400): super().__init__() self.screenWidth = screenWidth self.screenHeight =
  • Python PyQt5 QMessageBox not opening
    I am trying to open a Message Box when I press the infoButton. It runs the infoDialogue method because it prints "I'm here" but it doesn't open the infoBox. What I'm missing? I'm using python 3.5 with PyQt5 Thanks! Here's the code: import sys from PyQt5.QtWidgets import (QApplication, QWidget, QToolTip, QPushButton, QMessageBox) from PyQt5.QtCore import QCoreApplication from PyQt5.QtGui import QIcon, QFont class mainWindow(QWidget): def __init__(self, screenWidth, screenHeight, windowWidth=400, windowHeight=400): super().__init__() self.screenWidth = screenWidth self.screenHeight =
  • Use a picture or image in a QToolTip
    Is there a way to show a picture/image in a QToolTip? I want to show small images of keyboard-buttons to explain the user which buttons/shortcuts he can use on that specific widget.
  • PyQt5 的基本功能案例
    由于最近在学习pyqt5的相关知识,在网上找了几篇教程看,于是就写了这篇学习笔记。本文只是一些案例的代码以及演示,详细的讲解请看原文。 原文链接:https://zetcode.com/gui/pyqt5/ 中文翻译:http://www.360doc.com/content/19/1022/14/12906439_868371487.shtml 2、带窗口的图标 import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == '__main__': app = QApplication(sys.argv) w = QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle('FirstGUI') w.show() sys.exit(app.exec_()) 3、提示框 import sys from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton from PyQt5.QtGui import QFont class Example(QWidget): def __init__(self): super().__init__() self
  • pyqt5之基本窗口
    例1,简单的窗口 这个简单的小例子展示的是一个小窗口。但是我们可以在这个小窗口上面做很多事情,改变大小,最大化,最小化等,这需要很多代码才能实现。这在很多应用中很常见,没必要每次都要重写这部分代码,Qt已经提供了这些功能。PyQt5是一个高级的工具集合,相比使用低级的工具,能省略上百行代码。 """" fileName:simple.py brief:一个PyQt5的简单的例子 author:chenyijun date:2020-01-25 """ import sys #这里我们提供必要的引用,基本控件位于PyQt5.QtWidgets模块中 from PyQt5.QtWidgets import QApplication, QWidget if __name__ == '__main__': #每一PyQt5应用程序必须创建一个应用程序对象。sys.arg 参数是一个列表,从命令行输入参数。 app = QApplication(sys.argv) #QWidget部件是PyQt5所有用户界面对象的基类。他为QWidget提供默认构造函灵敏,默认构造函数没有父类。 w = QWidget(); #resize()方法调整窗口的大小,这窗口是250px宽,150px高 w.resize(350, 300); #move()方法移动口在屏幕上的位置到x = 300, y =
  • 【翻译 + 整理】Qt样式表详解(2):属性——背景相关属性
    1、alternate-background-color:交替背景色,用于QAbstractItemView的子类(QColumnView、QHeaderView、QListView、QTableView、QTreeView)。使用的前提是开启了隔行变色设置: setAlternatingRowColors(true); 例,设置两个交替变换的背景色: QTreeView { alternate-background-color: blue; background: yellow; } 2、background-color:背景色。 3、background:设置背景的简写形式。等效于指定background-color, background-image, background-repeat或background-position。以下类及其子类支持此属性:QAbstractItemView、QAbstractSpinBox、QCheckBox、QComboBox、QDialog、QFrame、QGroupBox、QLabel、QLineEdit、QMenu、QMenuBar、QPushButton、QRadioButton、QSplitter、QTextEdit、QToolTip、普通QWidgets。 例: QTextEdit{ background: yellow }
  • How to return mouse coordinates in realtime?
    I'm new to PyQt and I'm trying to use it to create a widget that returns the position of the mouse in real time. Here's what I have: import sys from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication) from PyQt5.QtGui import QFont class MouseTracker(QWidget): def __init__(self): super().__init__() self.initUI() self.setMouseTracking(True) self.installEventFilter(self) def initUI(self): self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Mouse Tracker') self.show() def eventFilter(self, source, event): if (event.type() == QtCore.QEvent.MouseMove and event.buttons() ==
  • How to make a queue persisted in HornetQ 2.2.5 core client?
    I want to make persisted queue in core hornetQ client. The problem is when I stop the server the queue and the data will be destroyed. How to make a queue persisted? My code is: import java.util.Date; import org.hornetq.api.core.TransportConfiguration; import org.hornetq.api.core.client.ClientConsumer; import org.hornetq.api.core.client.ClientMessage; import org.hornetq.api.core.client.ClientProducer; import org.hornetq.api.core.client.ClientSession; import org.hornetq.api.core.client.ClientSessionFactory; import org.hornetq.api.core.client.HornetQClient; import org.hornetq.api.core.client
  • 调用 getNextException 查看原因:How to make Hibernate / JPA show the DB server message for an exception(Call getNextException to see the cause : How to make Hibernate / JPA show the DB server message for an exception)
    问题 我正在使用 Postgresql、Hibernate 和 JPA。 每当数据库中出现异常时,我都会得到类似这样的信息,这并不是很有帮助,因为它没有显示数据库服务器上真正出了什么问题。 Caused by: java.sql.BatchUpdateException: Batch entry 0 update foo set ALERT_FLAG='3' was aborted. Call getNextException to see the cause. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2621) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1837) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement
  • 余烬数据:如何制作保存/保存的闪存消息(ember-data: How to make a Saving/Saved flash message)
    问题 为了在我的应用程序顶部制作一个黄色的“正在保存”/“已保存”指示符消息,我想要一个布尔属性来指示当前是否有任何 ember-data 记录正在运行。 我试过这个: App.store = DS.Store.create isSaving: (-> for record in this.get('recordCache') if record?.getPath('stateManager.currentState.name') == 'inFlight' return true return false ).property('recordCache.@each.stateManager.currentState.name') 但后来我发现recordCache是不可观察的。 我不使用事务,只使用App.store.commit() ,所以我查看了App.store.get('defaultTransaction') ,但它没有产生任何有用的东西。 我正在使用 RESTAdapter,所以如果我可以将其扩展为向我提供这条信息,那也可以。 回答1 好吧,您可以简单地创建一个带有 didUpdate 属性的基本模型,该属性处理显示您的通知消息,然后让您的每个模型扩展它。 这确实是一个权宜之计,但暂时有效: App.Model = DS.Model.extend didUpdate
  • PyQt5 draggable frameless window
    I found an example to set borders on a frameless window, however it's not draggable. How can I make a frameless window draggable? Especially if I can see an example it'll be awesome. Here is my example code(normally the code is longer, that's why there are much libraries just don't mind them); from PyQt5.QtWidgets import (QMessageBox,QApplication, QWidget, QToolTip, QPushButton, QDesktopWidget, QMainWindow, QAction, qApp, QToolBar, QVBoxLayout, QComboBox,QLabel,QLineEdit,QGridLayout,QMenuBar,QMenu,QStatusBar, QTextEdit,QDialog,QFrame,QProgressBar ) from PyQt5 import QtCore, QtWidgets, QtGui
  • 将外部事件循环与Qt相结合(Combing an External Event Loop with Qt's)
    问题 我正在为开源客户端/服务器4X策略游戏Thousand Parsec构建Qt客户端。 这是Google Summer of Code项目。 但是,我陷于死胡同。 基本上,客户端通过C ++协议层与服务器连接,从而促进客户端/服务器之间的通信。 该协议的文档可在此处获得。 现在我的问题是该协议要求您在客户端中创建虚拟EventLoop类(链接)的子类。 有一个示例SimpleEventLoop用于同一链接上的控制台客户端。 我很难弄清楚如何设计自己的事件循环子类来处理协议的事件,同时又将其连接到Qt应用程序中。 我的研究使我相信QAbstractEventDispatcher是我要使用的Qt类,但是文档似乎很苗条,我不确定我将如何去做。 其他人是否有将外部事件循环与Qt应用程序链接的经验? 我还在Qt页面上找到了这个示例,但是它不是很有帮助-至少我不是很了解。 谢谢! 回答1 我最近没有做过多的Qt开发,但是如果我没记错的话,您可以在自己的事件循环中调用QApplication :: processEvents()(而不是通过QApplication :: exec()启动Qt主循环) 编辑:我利用一个缓慢的星期天早晨的机会来测试/学习有关PyQt(Qt的Python绑定)的知识,并在下面拼凑了概念验证代码。 用基于QApplication::processEvents(
  • Whats the correct way to use net.Conn.Read for persistant TCP sockets
    I have a working TCP socket setup on my Go server. I accept an incoming connection, run a for loop and read incoming data using the net.Conn.Read function. But it just doesn't make sense to me. How does it know the full message has been received in order to continue with a return of message size? This is my code currently: func (tcpSocket *TCPServer) HandleConnection(conn net.Conn) { println("Handling connection! ", conn.RemoteAddr().String(), " connected!") recieveBuffer := make([]byte, 50) // largest message we ever get is 50 bytes defer func() { fmt.Println("Closing connection for: ", conn
  • pyside Get directory selected?
    How can I get the directory selected from after the user selects it from the 'browse...' button? My goal is to make a folder get created in that directory using the name in the project field. This 'selecting of the directory' is the last part I need help figuring out. Thank you guys. import sys import os from PySide import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget') # EditText Field labelProjectName = QtGui.QLabel(