Qt程序中,经常要使用弹窗来显示一些报警或提示信息,需要人机互动的直接选择模态弹窗就可以,但是有些只是提醒,并不需要阻塞程序运行的消息提醒,使用小弹窗再合适不过了,类似效果就是手机顶部的气泡弹窗。
Qt官方并没有提供这么一个类,一些开源组件中是有的,但是可能存在一些不兼容的情况,比如消息的设定方面,或者使用时会遇到一些莫名其妙的bug,那就自己写一个简单的,日后需要美化或复杂功能时再完善。
不使用designer,直接代码即可。
.h
#include class CustomSnakeBar : public QWidget { Q_OBJECT public: explicit CustomSnakeBar( QWidget *parent = nullptr ); void showMessage( const QString &message, int duration = 3000 ); private slots: void hide(); private: QTimer *timer; };
.cpp
- #include "customsnakebar.h"
- #include <QHBoxLayout>
- #include <QLabel>
- #include <QTimer>
-
- CustomSnakeBar::CustomSnakeBar( QWidget *parent )
- : QWidget( parent ) {
- setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint );
- setAttribute( Qt::WA_TranslucentBackground );
- setStyleSheet( " background-color: #FFA54F;font:22px;"
- "border-radius:5px;" );
- QHBoxLayout *layout = new QHBoxLayout( this );
- QLabel * messageLabel = new QLabel( this );
- layout->addWidget( messageLabel );
- timer = new QTimer( this );
- connect( timer, &QTimer::timeout, this, &CustomSnakeBar::hide );
- }
-
- void CustomSnakeBar::showMessage( const QString &message, int duration ) {
- QLabel *messageLabel = findChild<QLabel *>();
- messageLabel->setText( message );
- adjustSize();
- move( parentWidget()->x() + parentWidget()->width() / 2 - width() / 2, 0 );
- show();
- timer->start( duration );
- }
-
-
- void CustomSnakeBar::hide() {
- timer->stop();
- close();
- }
使用的话,在需要的地方直接showMessage(“XXX”)就可以了。