CINXE.COM

Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt

<!DOCTYPE html><html lang="en" itemscope itemtype="http://schema.org/Article"><head><!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB --><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="apple-touch-icon-precomposed" sizes="57x57" href="/static/images/favicons/apple-touch-icon-57x57.png" /><link rel="apple-touch-icon-precomposed" sizes="72x72" href="/static/images/favicons/apple-touch-icon-72x72.png" /><link rel="apple-touch-icon-precomposed" sizes="114x114" href="/static/images/favicons/apple-touch-icon-114x114.png" /><link rel="apple-touch-icon-precomposed" sizes="120x120" href="/static/images/favicons/apple-touch-icon-120x120.png" /><link rel="apple-touch-icon-precomposed" sizes="144x144" href="/static/images/favicons/apple-touch-icon-144x144.png" /><link rel="apple-touch-icon-precomposed" sizes="152x152" href="/static/images/favicons/apple-touch-icon-152x152.png" /><link title="EVILEG - Social network of programmers" rel="alternate" type="application/rss+xml" href="/en/feed/" /><link title="EVILEG - Forum" rel="alternate" type="application/rss+xml" href="/en/forum/feed/" /><title>Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt</title><meta property="og:title" content="Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt" /><meta property="og:type" content="website" /><meta property="og:url" content="https://evileg.com/en/post/146/" /><meta property="og:image" content="https://evileg.com/static/images/favicons/favicon.ico" /><meta property="og:site_name" content="EVILEG" /><meta name="google-site-verification" content="vVTpO8SvQTo0QU2hU-zDTBHgHzqr2CGx7ACdQHPlLes" /><meta name="yandex-verification" content="c58ddaad8c500539" /><meta name="wot-verification" content="5e851b19f7a76433f3dc"/><meta name="description" content="Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt. Functionality of the standard notification system tray at times can be insufficient for the implementation of ambitious pans for styling applications. We therefore consider the embodiment of pop-"/><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"><link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet" ><link href="/static/css/custom.css?9" rel="stylesheet"><script src="/static/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script><script src="/static/js/global.js?27"></script><script type="application/ld+json">{"@context": "http://schema.org", "@type": "ItemList", "itemListElement": [{"@type": "SiteNavigationElement", "position": 1, "name": "EVILEG", "url": "/en/"}, {"@type": "SiteNavigationElement", "position": 2, "name": "Articles", "url": "/en/knowledge/"}, {"@type": "SiteNavigationElement", "position": 3, "name": "Forum", "url": "/en/forum/"}, {"@type": "SiteNavigationElement", "position": 4, "name": "Tests", "url": "/en/tests/"}, {"@type": "SiteNavigationElement", "position": 5, "name": "Share code", "url": "/en/sharecode/"}, {"@type": "SiteNavigationElement", "position": 6, "name": "Share code", "url": "/en/sharecode/create/"}, {"@type": "SiteNavigationElement", "position": 7, "name": "Write article", "url": "/en/knowledge/article/add/"}, {"@type": "SiteNavigationElement", "position": 8, "name": "Ask a question", "url": "/en/forum/create_topic/"}]}</script></head><body class="bg-light"><nav class="navbar navbar-expand-lg navbar-dark fixed-top bg-dark"><div class="container-xxl"><button class="navbar-toggler collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#mainNavbar" aria-controls="mainNavbar" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><a class="navbar-brand ms-3 ms-lg-0" href="/en/">EVILEG</a><button class="btn btn-outline-secondary ms-auto d-block d-lg-none" type="button" data-bs-toggle="modal" data-bs-target="#menuModal" aria-controls="menuModal" title="Menu"><span class="bi bi-grid-3x3-gap-fill"></span></button><a class="btn btn-outline-secondary ms-2 d-block d-lg-none" href="/en/accounts/login/" title="Login"> Login </a><div class="navbar-collapse collapse" id="mainNavbar"><form role="search" action="/en/search/" method="get" class="mt-3 mt-lg-0"><input id="search" name="search" type="search" class="form-control" placeholder="Search..." title="Search"></form><ul class="navbar-nav ms-2 mb-2 mb-lg-0"><li class="nav-item"><a class="nav-link" href="/en/knowledge/">Articles</a></li><li class="nav-item"><a class="nav-link" href="/en/forum/">Forum</a></li><li class="nav-item"><a class="nav-link" href="/en/tests/">Tests</a></li><li class="nav-item"><a class="nav-link" href="/en/sharecode/">Share code</a></li><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-expanded="false">EN</a><ul class="dropdown-menu"><a class="dropdown-item" href="/lang/ru/">Русский</a><a class="dropdown-item" href="/lang/uk/">Українська</a><a class="dropdown-item" href="/lang/en/">English</a><a class="dropdown-item" href="/lang/kk/">Қазақ</a><a class="dropdown-item" href="/lang/de/">Deutsch</a></ul></li></ul></div><button class="btn btn-outline-secondary ms-2 d-none d-lg-block" type="button" data-bs-toggle="modal" data-bs-target="#menuModal" aria-controls="menuModal" title="Menu"><span class="bi bi-grid-3x3-gap-fill"></span></button><a class="btn btn-outline-secondary ms-2 d-none d-lg-block" href="/en/accounts/login/" title="Login"> Login </a></div></nav><main class="container-xxl"><div class="row"><div class="col-12 col-lg overflow-hidden"><ul class="breadcrumb bg-light"><li class="breadcrumb-item"><a href="/en/"><i class="bi bi-house"><span class="d-none">EVILEG</span></i></a></li><li class="breadcrumb-item"><a href="/en/knowledge/">Articles</a></li><li class="breadcrumb-item"><a href="/en/knowledge/qt/">Qt</a></li><li class="breadcrumb-item active">Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt</li></ul><script type="application/ld+json">{"@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "item": {"@type": "Thing", "@id": "/en/", "name": "EVILEG"}}, {"@type": "ListItem", "position": 2, "item": {"@type": "Thing", "@id": "/en/knowledge/", "name": "Articles"}}, {"@type": "ListItem", "position": 3, "item": {"@type": "Thing", "@id": "/en/knowledge/qt/", "name": "Qt"}}, {"@type": "ListItem", "position": 4, "item": {"@type": "Thing", "@id": "/en/post/146/", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt"}}]}</script><div ><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8160668332851230" crossorigin="anonymous"></script><!-- EVILEG ADS TOP --><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-8160668332851230" data-ad-slot="6001381692" data-ad-format="auto" data-full-width-responsive="true"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><article><div itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><div itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"><link itemprop="image" href="/static/images/favicons/apple-touch-icon-152x152.png"><link itemprop="url" href="/static/images/favicons/apple-touch-icon-152x152.png"><meta itemprop="width" content="152"><meta itemprop="height" content="152"></div><meta itemprop="name" content="EVILEG"><meta itemprop="address" content="EVILEG"><meta itemprop="telephone" content="-"><link itemprop="url" href="https://evileg.com"></div><link itemprop="mainEntityOfPage" itemscope href="/en/post/146/" /><meta itemprop="commentCount" content="9"><meta itemprop="articleSection" content="Qt"><div itemscope itemprop="author" itemtype="https://schema.org/Person"><meta itemprop="name" content="Evgenii Legotckoi"><link itemprop="url" content="/en/users/2/"></div><meta itemprop="url" content="/en/post/146/"><meta itemprop="accessMode" content="textual"><meta itemprop="wordCount" content="1042"><meta itemprop="datePublished" content="Jan. 23, 2016, 9:48 p.m."><meta itemprop="dateModified" content="March 30, 2023, 1:28 a.m."><div itemprop="interactionStatistic" itemscope itemtype="https://schema.org/InteractionCounter"><meta itemprop="interactionType" content="https://schema.org/BookmarkAction"><meta itemprop="userInteractionCount" content="0"></div><div itemprop="interactionStatistic" itemscope itemtype="https://schema.org/InteractionCounter"><meta itemprop="interactionType" content="https://schema.org/LikeAction"><meta itemprop="userInteractionCount" content="3"></div><div itemprop="interactionStatistic" itemscope itemtype="https://schema.org/InteractionCounter"><meta itemprop="interactionType" content="https://schema.org/DislikeAction"><meta itemprop="userInteractionCount" content="0"></div><meta itemprop="keywords" content="Gnome,всплывающее уведомление,Qt,PopUp,Уведомление"><div class="card mb-3"><div class="card-header d-flex py-2"><a href=/en/users/2/><img loading="lazy" alt="Evgenii Legotckoi" class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" src="/media/cache/7a/08/7a0837c6eb199ca9af1a03ea5ccbfcbf.webp"></a><div class="ms-3"><div><a href="/en/users/2/" class="text-decoration-none">Evgenii Legotckoi</a></div><small class="text-secondary">Jan. 23, 2016, 9:48 p.m.</small></div></div><div class="card-body"><h1 itemprop="headline">Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt</h1><div><p><a href="/en/search/?search=%23Gnome">Gnome</a>, <a href="/en/search/?search=%23%D0%B2%D1%81%D0%BF%D0%BB%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B5%20%D1%83%D0%B2%D0%B5%D0%B4%D0%BE%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5">всплывающее уведомление</a>, <a href="/en/search/?search=%23Qt">Qt</a>, <a href="/en/search/?search=%23PopUp">PopUp</a>, <a href="/en/search/?search=%23%D0%A3%D0%B2%D0%B5%D0%B4%D0%BE%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5">Уведомление</a></p></div><div itemprop="articleBody"><div class="card border mb-3"><div class="card-header">Content</div><div class="card-body"><ol class="list-unstyled mb-0"><li><span>1. </span><span><a href="#header_Project_structure">Project structure</a></span></li><li><span>2. </span><span><a href="#header_PopupWindow.pro_и_mainwindow.ui">PopupWindow.pro и mainwindow.ui</a></span></li><li><span>3. </span><span><a href="#header_mainwindow.h">mainwindow.h</a></span></li><li><span>4. </span><span><a href="#header_mainwindow.cpp">mainwindow.cpp</a></span></li><li><span>5. </span><span><a href="#header_popup.h">popup.h</a></span></li><li><span>6. </span><span><a href="#header_popup.cpp">popup.cpp</a></span></li><li><span>7. </span><span><a href="#header_Result">Result</a></span></li><li><span>8. </span><span><a href="#header_Video">Video</a></span></li></ol></div></div><p> Functionality of the standard notification system tray at times can be insufficient for the implementation of ambitious pans for styling applications. We therefore consider the embodiment of pop-up messages in the style of PopUp DE Gnome notification, namely, as shown in the following figure. </p><p><img alt="" class="img-fluid" loading="lazy" src="/media/uploads/2016/12/24/popup.png"/></p><p> PopUp notification Gnome style </p><p> To demonstrate the notification I propose to create an application, which will be a field for entering text, and a button by pressing which will be called a pop-up message. </p><p> The message will be displayed in the lower right corner of the tray system tray. This notice must be sure to scale the contents. </p><p> Fade-in it will be implemented within 150 milliseconds and the disappearance, after three seconds. </p><hr/><h2><a class="anchor" id="header_Project_structure"></a> Project structure </h2><ul><li><strong> PopupWindow.pro </strong> - the profile of the project; </li><li><strong> mainwindow.h </strong> - header file of the main application window; </li><li><strong> mainwindow.cpp </strong> - file source code of the main application window; </li><li><strong> mainwindow.ui </strong> - form the main application window; </li><li><strong> main.cpp </strong> - start file the application source code; </li><li><strong> popup.h </strong> - header file notifications; </li><li><strong> popup.cpp </strong> - file source pop-up message. </li></ul><h2><a class="anchor" id="header_PopupWindow.pro_и_mainwindow.ui"></a> PopupWindow.pro и mainwindow.ui </h2><p> The profile of the project, do not connect anything special, but in the main application window, just put a button and a text entry field. </p><h2><a class="anchor" id="header_mainwindow.h"></a> mainwindow.h </h2><p> The header of the main window of the application you must include the header file PopUp notification and declare the notification object itself, and there will be declared a slot for processing pressing the start button a pop-up notification. This slot will be installed in the text notification and position change notifications on the computer screen in the notification size. </p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8160668332851230" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-8160668332851230" data-ad-slot="5700035342"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><pre><pre class="prettyprint linenums"> #ifndef MAINWINDOW_H #define MAINWINDOW_H #include &lt;QMainWindow&gt; #include "popup.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; PopUp *popUp; }; #endif // MAINWINDOW_H </pre></pre><h2><a class="anchor" id="header_mainwindow.cpp"></a> mainwindow.cpp </h2><pre><pre class="prettyprint linenums"> #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui-&gt;setupUi(this); popUp = new PopUp(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { popUp-&gt;setPopupText(ui-&gt;textEdit-&gt;toPlainText()); popUp-&gt;show(); } </pre></pre><h2><a class="anchor" id="header_popup.h"></a> popup.h </h2><p> In order to prepare the notification must be inherited from <strong> QWidget </strong> class that you want to disable window decoration, and put a transparent background. You also need to set it up so that a notice was always on top of all windows. Rendering translucent background notification will be made in the method <strong> paintEvent() </strong> , in which the full width and height of the notification widget is drawn semi-transparent black rectangle with rounded edges. </p><p> Animation appearance and disappearance of the notification will be made through <strong> QPropertyAnimation </strong> object. </p><p> What is important: fitting the size of the widget should be made at the time the text in the notification, and not during the redrawing or installation location notifications on the screen, or to be received is not correct size and magnitude of the notice, it will not in the expected location, or not with the expected size. </p><p> To implement time-limited display notifications on the screen applies <a href="https://evileg.com/post/72/"> QTimer </a> . </p><pre><pre class="prettyprint linenums"> #ifndef POPUP_H #define POPUP_H #include &lt;QWidget&gt; #include &lt;QLabel&gt; #include &lt;QGridLayout&gt; #include &lt;QPropertyAnimation&gt; #include &lt;QTimer&gt; class PopUp : public QWidget { Q_OBJECT Q_PROPERTY(float popupOpacity READ getPopupOpacity WRITE setPopupOpacity) void setPopupOpacity(float opacity); float getPopupOpacity() const; public: explicit PopUp(QWidget *parent = 0); protected: void paintEvent(QPaintEvent *event); // The background will be drawn through the redraw method public slots: void setPopupText(const QString&amp; text); // Setting text notification void show(); /* own widget displaying method   * It is necessary to pre-animation settings * */ private slots: void hideAnimation(); // Slot start the animation hide void hide(); /* At the end of the animation, it is checked in a given slot,                                              * Does the widget visible, or to hide * */ private: QLabel label; QGridLayout layout; QPropertyAnimation animation; float popupOpacity; QTimer *timer; }; #endif // POPUP_H </pre></pre><h2><a class="anchor" id="header_popup.cpp"></a> popup.cpp </h2><pre><pre class="prettyprint linenums"> #include "popup.h" #include &lt;QPainter&gt; #include &lt;QApplication&gt; #include &lt;QDesktopWidget&gt; #include &lt;QDebug&gt; PopUp::PopUp(QWidget *parent) : QWidget(parent) { setWindowFlags(Qt::FramelessWindowHint | // Disable window decoration Qt::Tool | // Discard display in a separate window Qt::WindowStaysOnTopHint); // Set on top of all windows setAttribute(Qt::WA_TranslucentBackground); // Indicates that the background will be transparent setAttribute(Qt::WA_ShowWithoutActivating); // At the show, the widget does not get the focus automatically animation.setTargetObject(this); // Set the target animation animation.setPropertyName("popupOpacity"); // connect(&amp;animation, &amp;QAbstractAnimation::finished, this, &amp;PopUp::hide); label.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); label.setStyleSheet("QLabel { color : white; " "margin-top: 6px;" "margin-bottom: 6px;" "margin-left: 10px;" "margin-right: 10px; }"); layout.addWidget(&amp;label, 0, 0); setLayout(&amp;layout); timer = new QTimer(); connect(timer, &amp;QTimer::timeout, this, &amp;PopUp::hideAnimation); } void PopUp::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QRect roundedRect; roundedRect.setX(rect().x() + 5); roundedRect.setY(rect().y() + 5); roundedRect.setWidth(rect().width() - 10); roundedRect.setHeight(rect().height() - 10); painter.setBrush(QBrush(QColor(0,0,0,180))); painter.setPen(Qt::NoPen); painter.drawRoundedRect(roundedRect, 10, 10); } void PopUp::setPopupText(const QString &amp;text) { label.setText(text); // Set the text in the Label adjustSize(); // With the recalculation notice sizes } void PopUp::show() { setWindowOpacity(0.0); // Set the transparency to zero animation.setDuration(150); // Configuring the duration of the animation animation.setStartValue(0.0); // The start value is 0 (fully transparent widget) animation.setEndValue(1.0); // End - completely opaque widget setGeometry(QApplication::desktop()-&gt;availableGeometry().width() - 36 - width() + QApplication::desktop() -&gt; availableGeometry().x(), QApplication::desktop()-&gt;availableGeometry().height() - 36 - height() + QApplication::desktop() -&gt; availableGeometry().y(), width(), height()); QWidget::show(); animation.start(); timer-&gt;start(3000); } void PopUp::hideAnimation() { timer-&gt;stop(); animation.setDuration(1000); animation.setStartValue(1.0); animation.setEndValue(0.0); animation.start(); } void PopUp::hide() { // If the widget is transparent, then hide it if(getPopupOpacity() == 0.0){ QWidget::hide(); } } void PopUp::setPopupOpacity(float opacity) { popupOpacity = opacity; setWindowOpacity(opacity); } float PopUp::getPopupOpacity() const { return popupOpacity; } </pre></pre><h2><a class="anchor" id="header_Result"></a> Result </h2><p> Archive of the source: <a href="/media/uploads/2016/12/24/popupwindow.zip"> PopupWindow </a></p><p> As a result, the message will be as follows: </p><p><img alt="" class="img-fluid" loading="lazy" src="/media/uploads/2016/12/24/popup_2.png"/></p><h2><a class="anchor" id="header_Video"></a> Video </h2><p></p><div class="youtube-wrapper"><iframe class="youtube-iframe" src="//www.youtube.com/embed/QvaS6nVRFAU"></iframe></div></div><div class="mt-3"><a href="https://timeweb.com/ru/?i=27415&amp;utm_source=evileg&amp;utm_medium=after_article&amp;utm_campaign=base" rel="nofollow" target="_blank"><div class="d-flex"><div class="me-3"><img src="/media/technical_storage/timeweb-120-90.jpg" alt="We recommend hosting TIMEWEB"></div><div><h5 class="mt-0">We recommend hosting TIMEWEB</h5> Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting. </div></div></a></div></div><div class="card-body border-top"><p><strong>Recommended articles on this topic</strong></p><ul><li><a href="/en/post/156/">Qt/C++ - Lesson 052. Customization Qt Audio player in the style of AIMP</a></li><li><a href="/en/post/197/">QML - Lesson 024. Custom QQuickItem – How to add QML object from C++</a></li><li><a href="/en/post/178/">QML - Lesson 006. Custom Calendar in Qt QML or Qt QML Android</a></li><li><a href="/en/post/65/">QML - Lesson 003. Custom Dialog in QML Android</a></li><li><a href="/en/post/64/">QML - Lesson 002. Custom Button in QML Android</a></li></ul><p><strong class="me-1">By article asked</strong><a href="/en/forum/?search=article:146">0<span class="ms-1">question(s)</span></a></p><div class="form-check form-switch d-flex justify-content-between align-items-center"><input class="form-check-input me-3" type="checkbox" role="switch" disabled><label class="form-check-label mt-1">Subscribe to the discussion</label><span class="badge text-bg-primary ms-auto">6</span></div><div class="form-check form-switch d-flex justify-content-between align-items-center"><input class="form-check-input me-3" type="checkbox" role="switch" disabled><label class="form-check-label mt-1"><a href="/en/knowledge/qt/">Section subscription</a></label><span class="badge text-bg-primary ms-auto">348</span></div></div><div class="m-3 p-3 bg-light rounded text-center"><p>Do you like it? Share on social networks!</p><script async src="https://yastatic.net/share2/share.js"></script><div class="ya-share2" data-curtain data-size="l" data-shape="round" data-lang="en" data-services="telegram,vkontakte,twitter,linkedin,reddit,odnoklassniki,whatsapp,skype,tumblr,lj,pocket,surfingbird"></div></div><div class="card-footer"><div class="btn btn-sm" title="Views"><i class="bi bi-eye me-1"></i>5.9K</div><a class="btn btn-sm btn-light" title="Comments" href="/en/post/146/#comments"><i class="bi bi-chat-left me-1"></i>9</a><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>3</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div></div></article><a class="anchor" id="comments"></a><div id="comments-feed"><a class="anchor" name="comment-791"></a><div id="791" class="card mb-3"><div class="card-header d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/3401/>m</a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/3401/">magrif</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-791" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">June 14, 2018, 8:40 p.m.</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p> В Astra Linux вместо прозрачности черный фон. Не знаеете, что может быть? <br/></p></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "magrif", "url": "/en/post/146/#comment-791", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n В Astra Linux вместо прозрачности черный фон. Не знаеете, что может быть?\n \n \n", "datePublished": "2018-06-14T14:40:57.004135+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div><a class="anchor" name="comment-798"></a><div id="798" class="card mb-3"><div class="card-header d-flex py-2"><a href=/en/users/2/><img loading="lazy" alt="Evgenii Legotckoi" class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" src="/media/cache/7a/08/7a0837c6eb199ca9af1a03ea5ccbfcbf.webp"></a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/2/">Evgenii Legotckoi</a> &rarr; <a class="text-muted" href="#comment-791">magrif</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-798" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">June 18, 2018, 1:10 p.m.</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p> Недоработки, вряд ли этот зверь вообще является официально поддерживаемым </p></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "Evgenii Legotckoi", "url": "/en/post/146/#comment-798", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n Недоработки, вряд ли этот зверь вообще является официально поддерживаемым\n \n", "datePublished": "2018-06-18T07:10:46.561743+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div><a class="anchor" name="comment-1373"></a><div id="1373" class="card mb-3"><div class="card-header d-flex py-2"><a href=/en/users/3566/><img loading="lazy" alt="IscanderChe" class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" src="/media/cache/18/bd/18bde7166d561be77067348b215e9b88.webp"></a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/3566/">IscanderChe</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-1373" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">July 11, 2019, 10:27 p.m.</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p> Евгений, не совсем понимаю, как связывается свойство полупрозрачности Q_PROPERTY(float popupOpacity READ getPopupOpacity WRITE setPopupOpacity) со свойством анимации QPropertyAnimation animation. Проясните момент. И где про это прочитать поподробнее. </p></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "IscanderChe", "url": "/en/post/146/#comment-1373", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n Евгений, не совсем понимаю, как связывается свойство полупрозрачности Q_PROPERTY(float popupOpacity READ getPopupOpacity WRITE setPopupOpacity) со свойством анимации QPropertyAnimation animation. Проясните момент. И где про это прочитать поподробнее.\n \n", "datePublished": "2019-07-11T16:27:00.203845+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div><a class="anchor" name="comment-1374"></a><div id="1374" class="card mb-3"><div class="card-header d-flex py-2"><a href=/en/users/2/><img loading="lazy" alt="Evgenii Legotckoi" class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" src="/media/cache/7a/08/7a0837c6eb199ca9af1a03ea5ccbfcbf.webp"></a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/2/">Evgenii Legotckoi</a> &rarr; <a class="text-muted" href="#comment-1373">IscanderChe</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-1374" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">July 12, 2019, 2:24 a.m.</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p> Все свойства в объектах, которые наследуются от Q_OBJECT и помечены макросом Q_PROPERTY, могут вызываться по своему имени с помощью <strong> QMetaObject::invokeMethod </strong> . Подробнее можете почитать в документации на <a href="https://doc.qt.io/qt-5/qmetaobject.html" rel="nofollow"> QMetaObject </a> . </p><p> Именно это и используется для вызова свойста внутри QPropertyAnimation. Исходники я не смотрел, но уверен но 100% что там будет <strong> QMetaObject::invokeMethod </strong> или что-то похожее. </p><p> Обычно используется так </p><pre><pre class="lang-cpp prettyprint linenums">QString retVal; QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection, Q_RETURN_ARG(QString, retVal), Q_ARG(QString, "sqrt"), Q_ARG(int, 42), Q_ARG(double, 9.7)); </pre></pre><p> А о том, какое свойство вызывать QPropertyAnimation узнаёт через установку целевого объекта и имени свойства объекта, которое нужно вызывать. </p><pre><pre class="lang-cpp prettyprint linenums">animation.setTargetObject(this); // Устанавливаем целевой объект анимации animation.setPropertyName("popupOpacity"); // Устанавливаем анимируемое свойство </pre></pre><p> Видимо это был такой способ обойти шаблонизацию в своё время у них. Думаю, что сейчас это можно с помощью шаблонов решать более изящно. Но вообще, очень не удобно, когда в проекте повсеместно используют <strong> QMetaObject::invokeMethod </strong> . Трудно отлаживать и иногда вообще не ясно откуда прилетает вызов функции, а callstack так вообще уродский. </p></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>1</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "Evgenii Legotckoi", "url": "/en/post/146/#comment-1374", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n Все свойства в объектах, которые наследуются от Q_OBJECT и помечены макросом Q_PROPERTY, могут вызываться по своему имени с помощью\n \n QMetaObject::invokeMethod\n \n . Подробнее можете почитать в документации на\n \n QMetaObject\n \n .\n \n \n Именно это и используется для вызова свойста внутри QPropertyAnimation. Исходники я не смотрел, но уверен но 100% что там будет\n \n QMetaObject::invokeMethod\n \n или что-то похожее.\n \n \n Обычно используется так\n \n QString retVal;\nQMetaObject::invokeMethod(obj, \"compute\", Qt::DirectConnection,\n Q_RETURN_ARG(QString, retVal),\n Q_ARG(QString, \"sqrt\"),\n Q_ARG(int, 42),\n Q_ARG(double, 9.7));\n\n \n А о том, какое свойство вызывать QPropertyAnimation узнаёт через установку целевого объекта и имени свойства объекта, которое нужно вызывать.\n \n animation.setTargetObject(this); // Устанавливаем целевой объект анимации\nanimation.setPropertyName(\"popupOpacity\"); // Устанавливаем анимируемое свойство\n\n \n Видимо это был такой способ обойти шаблонизацию в своё время у них. Думаю, что сейчас это можно с помощью шаблонов решать более изящно. Но вообще, очень не удобно, когда в проекте повсеместно используют\n \n QMetaObject::invokeMethod\n \n . Трудно отлаживать и иногда вообще не ясно откуда прилетает вызов функции, а callstack так вообще уродский.\n \n", "datePublished": "2019-07-11T20:24:02.678743+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 1}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div><a class="anchor" name="comment-1954"></a><div id="1954" class="card mb-3"><div class="card-header d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/5928/>ИК</a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/5928/">Иван Коноплёв</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-1954" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">June 20, 2020, 7:15 p.m.</small></li><li id='post_lastmod_1954' class="list-inline-item me-2" title="June 22, 2020, 12:20 p.m."><small class="text-secondary">(edited)</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p> Переписал на python, но почему-то не закрывается при вызове hide()? А при вызове из другого модуля вообще не отображается окно? </p><pre><pre class="lang-py prettyprint linenums"># This Python file uses the following encoding: utf-8 import sys import os from PySide2.QtWidgets import QWidget, QLabel, QGridLayout, QApplication from PySide2.QtCore import QTimer, QPropertyAnimation, Qt, QRect from PySide2.QtGui import QPainter, QBrush, QColor, QBackingStore class Info(QWidget): def __init__(self, text = "", parent = None): super().__init__(parent) self.text = text self.label = QLabel(text) # Label с сообщением self.adjustSize() self.layout = QGridLayout() # Размещение для лейбла self.animation = QPropertyAnimation(self) # Свойство анимации для всплывающего сообщения # Свойства полупрозрачности виджета self.timer = QTimer() # Таймер, по которому виджет будет скрыт self.setWindowFlags(Qt.FramelessWindowHint | # Отключаем оформление окна Qt.Tool | # Отменяем показ в качестве отдельного окна Qt.WindowStaysOnTopHint) # Устанавливаем поверх всех окон self.setAttribute(Qt.WA_TranslucentBackground) # Указываем, что фон будет прозрачным self.setAttribute(Qt.WA_ShowWithoutActivating) # При показе, виджет не получается фокуса автоматически self.animation.setTargetObject(self) # Устанавливаем целевой объект анимации self.animation.setPropertyName(b'windowOpacity') # Устанавливаем анимируемое свойство #self.animation.stateChanged.connect(self.hide()) # Подключаем сигнал окончания анимации к слоты скрытия #connect(&amp;animation, &amp;QAbstractAnimation::finished, this, &amp;PopUp::hide); # Настройка текста уведомления self.label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) # Устанавливаем по центру # И настраиваем стили self.label.setStyleSheet("QLabel { color : white; " "margin-top: 6px;" "margin-bottom: 6px;" "margin-left: 10px;" "margin-right: 10px; }") # Производим установку текста в размещение, ... self.layout.addWidget(self.label, 0, 0) self.setLayout(self.layout) # которое помещаем в виджет # По сигналу таймера будет произведено скрытие уведомления, если оно видимо #self.timer = QTimer() self.timer.timeout.connect(self.hideAnimation) #connect(timer, &amp;QTimer::timeout, this, &amp;PopUp::hideAnimation); #@property #def popupOpacity(self): # return self._popupOpacity #@popupOpacity.setter #def popupOpacity(self, opacity): # self._popupOpacity = opacity # self.setWindowOpacity(opacity) def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) # Включаем сглаживание # Подготавливаем фон. rect() возвращает внутреннюю геометрию виджета уведомления, по содержимому roundedRect = QRect() roundedRect.setX(self.rect().x() + 5) roundedRect.setY(self.rect().y() + 5) roundedRect.setWidth(self.rect().width() - 10) roundedRect.setHeight(self.rect().height() - 10) # Кисть настраиваем на чёрный цвет в режиме полупрозрачности 180 из 255 painter.setBrush(QBrush(QColor(0,0,0,180))) painter.setPen(Qt.NoPen) # Край уведомления не будет выделен # Отрисовываем фон с закруглением краёв в 10px painter.drawRoundedRect(roundedRect, 10, 10) def setPopupText(self, text): self.label.setText(text) # Устанавливаем текст в Label self.adjustSize() # С пересчётом размеров уведомления def show(self): self.setWindowOpacity(0.0) # Устанавливаем прозрачность в ноль self.animation.setDuration(150) # Настраиваем длительность анимации self.animation.setStartValue(0.0) # Стартовое значение будет 0 (полностью прозрачный виджет) self.animation.setEndValue(1.0) # Конечное - полностью непрозрачный виджет self.setGeometry(QApplication.desktop().availableGeometry().width() - 36 - self.width() + QApplication.desktop().availableGeometry().x(), QApplication.desktop().availableGeometry().height() - 36 - self.height() + QApplication.desktop().availableGeometry().y(), self.width(), self.height()) QWidget.show(self) # Отображаем виджет, который полностью прозрачен self.animation.start() # И запускаем анимацию self.timer.start(3000) # А также стартуем таймер, который запустит скрытие уведомления через 3 секунды def hideAnimation(self): self.timer.stop() # Останавливаем таймер self.timer.timeout.disconnect(self.hideAnimation) self.animation.setDuration(100) # Настраиваем длительность анимации self.animation.setStartValue(1.0) # Стартовое значение будет 1 (полностью непрозрачный виджет) self.animation.setEndValue(0.0) # Конечное - полностью прозрачный виджет self.timer.timeout.connect(self.hide) self.timer.start(3000) self.animation.start() # И запускаем анимацию def hide(self): # Если виджет прозрачный, то скрываем его print('hide') #QWidget.show(self) self.timer.stop() self.animation.stop() self.close() def __repr__(self): return 'Info class' if __name__ == "__main__": # app disexec теперь на pyqt app = QApplication(sys.argv) app.setStyle('Fusion') window = Info("This works fine") window.show() sys.exit(app.exec_()) </pre></pre></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "Иван Коноплёв", "url": "/en/post/146/#comment-1954", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n Переписал на python, но почему-то не закрывается при вызове hide()? А при вызове из другого модуля вообще не отображается окно?\n \n # This Python file uses the following encoding: utf-8\nimport sys\nimport os\n\nfrom PySide2.QtWidgets import QWidget, QLabel, QGridLayout, QApplication \nfrom PySide2.QtCore import QTimer, QPropertyAnimation, Qt, QRect\nfrom PySide2.QtGui import QPainter, QBrush, QColor, QBackingStore\n\nclass Info(QWidget):\n def __init__(self, text = \"\", parent = None):\n super().__init__(parent)\n\n self.text = text\n self.label = QLabel(text) # Label с сообщением\n self.adjustSize()\n self.layout = QGridLayout() # Размещение для лейбла\n self.animation = QPropertyAnimation(self) # Свойство анимации для всплывающего сообщения\n # Свойства полупрозрачности виджета\n self.timer = QTimer() # Таймер, по которому виджет будет скрыт\n\n self.setWindowFlags(Qt.FramelessWindowHint | # Отключаем оформление окна\n Qt.Tool | # Отменяем показ в качестве отдельного окна\n Qt.WindowStaysOnTopHint) # Устанавливаем поверх всех окон\n self.setAttribute(Qt.WA_TranslucentBackground) # Указываем, что фон будет прозрачным\n self.setAttribute(Qt.WA_ShowWithoutActivating) # При показе, виджет не получается фокуса автоматически\n\n\n self.animation.setTargetObject(self) # Устанавливаем целевой объект анимации\n self.animation.setPropertyName(b'windowOpacity') # Устанавливаем анимируемое свойство\n\n #self.animation.stateChanged.connect(self.hide()) # Подключаем сигнал окончания анимации к слоты скрытия \n #connect(&amp;animation, &amp;QAbstractAnimation::finished, this, &amp;PopUp::hide); \n\n # Настройка текста уведомления\n self.label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) # Устанавливаем по центру\n # И настраиваем стили\n self.label.setStyleSheet(\"QLabel { color : white; \"\n \"margin-top: 6px;\"\n \"margin-bottom: 6px;\"\n \"margin-left: 10px;\"\n \"margin-right: 10px; }\")\n\n # Производим установку текста в размещение, ...\n self.layout.addWidget(self.label, 0, 0)\n self.setLayout(self.layout) # которое помещаем в виджет\n\n # По сигналу таймера будет произведено скрытие уведомления, если оно видимо\n #self.timer = QTimer()\n self.timer.timeout.connect(self.hideAnimation)\n\n #connect(timer, &amp;QTimer::timeout, this, &amp;PopUp::hideAnimation);\n\n #@property\n #def popupOpacity(self): \n # return self._popupOpacity\n\n #@popupOpacity.setter\n #def popupOpacity(self, opacity):\n # self._popupOpacity = opacity\n # self.setWindowOpacity(opacity)\n\n def paintEvent(self, event):\n painter = QPainter(self) \n painter.setRenderHint(QPainter.Antialiasing) # Включаем сглаживание\n\n # Подготавливаем фон. rect() возвращает внутреннюю геометрию виджета уведомления, по содержимому\n roundedRect = QRect()\n roundedRect.setX(self.rect().x() + 5)\n roundedRect.setY(self.rect().y() + 5)\n roundedRect.setWidth(self.rect().width() - 10)\n roundedRect.setHeight(self.rect().height() - 10)\n\n # Кисть настраиваем на чёрный цвет в режиме полупрозрачности 180 из 255\n painter.setBrush(QBrush(QColor(0,0,0,180)))\n painter.setPen(Qt.NoPen) # Край уведомления не будет выделен\n\n # Отрисовываем фон с закруглением краёв в 10px\n painter.drawRoundedRect(roundedRect, 10, 10)\n\n def setPopupText(self, text):\n self.label.setText(text) # Устанавливаем текст в Label\n self.adjustSize() # С пересчётом размеров уведомления\n\n\n def show(self):\n self.setWindowOpacity(0.0) # Устанавливаем прозрачность в ноль\n\n self.animation.setDuration(150) # Настраиваем длительность анимации\n self.animation.setStartValue(0.0) # Стартовое значение будет 0 (полностью прозрачный виджет)\n self.animation.setEndValue(1.0) # Конечное - полностью непрозрачный виджет\n\n self.setGeometry(QApplication.desktop().availableGeometry().width() - 36 - self.width() + QApplication.desktop().availableGeometry().x(),\n QApplication.desktop().availableGeometry().height() - 36 - self.height() + QApplication.desktop().availableGeometry().y(),\n self.width(),\n self.height())\n\n QWidget.show(self) # Отображаем виджет, который полностью прозрачен\n\n self.animation.start() # И запускаем анимацию\n self.timer.start(3000) # А также стартуем таймер, который запустит скрытие уведомления через 3 секунды\n\n\n def hideAnimation(self):\n self.timer.stop() # Останавливаем таймер\n self.timer.timeout.disconnect(self.hideAnimation)\n self.animation.setDuration(100) # Настраиваем длительность анимации\n self.animation.setStartValue(1.0) # Стартовое значение будет 1 (полностью непрозрачный виджет)\n self.animation.setEndValue(0.0) # Конечное - полностью прозрачный виджет\n self.timer.timeout.connect(self.hide)\n self.timer.start(3000)\n self.animation.start() # И запускаем анимацию\n\n\n def hide(self):\n # Если виджет прозрачный, то скрываем его\n print('hide') \n #QWidget.show(self) \n self.timer.stop()\n self.animation.stop()\n self.close()\n\n def __repr__(self):\n return 'Info class'\n\nif __name__ == \"__main__\":\n # app disexec теперь на pyqt\n app = QApplication(sys.argv)\n app.setStyle('Fusion')\n\n window = Info(\"This works fine\")\n window.show() \n\n sys.exit(app.exec_())\n\n\n\n", "datePublished": "2020-06-20T13:15:14.695930+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div><a class="anchor" name="comment-2218"></a><div id="2218" class="card mb-3"><div class="card-header d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/5180/>AC</a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/5180/">Alexandru Codreanu</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-2218" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">Aug. 6, 2021, 10:22 p.m.</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p> Доброго времени суток. <br/> Возник вопрос - установлена Qt 6.1.2 </p><p><strong> popup.cpp </strong></p><pre><pre class="prettyprint linenums">#include &lt;QDesktopWidget&gt; </pre></pre><p> Выводит ошибку: <em> popup.cpp:5:10: error: 'QDesktopWidget' file not found </em></p><p> ... в Qt 5.15 использовал метод <strong><em> QApplication::desktop() </em></strong></p><pre><pre class="prettyprint linenums"> setGeometry(QApplication::desktop()-&gt;geometry().width() - 36 - width() + QApplication::desktop()-&gt;geometry().x(), QApplication::desktop()-&gt;geometry().height() - 56 - height() + QApplication::desktop()-&gt;geometry().y(), width(), height()); </pre></pre><p> На данный момент ошибка: <em> popup.cpp:81:31: error: no member named 'desktop' in 'QApplication' </em></p><p> В документации - метод <strong><em> QApplication::desktop() </em></strong> устарел - никак не могу понять какой метод использовать ? </p></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "Alexandru Codreanu", "url": "/en/post/146/#comment-2218", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n Доброго времени суток.\n \n Возник вопрос - установлена Qt 6.1.2\n \n \n \n popup.cpp\n \n \n #include &lt;QDesktopWidget&gt;\n\n \n Выводит ошибку:\n \n popup.cpp:5:10: error: 'QDesktopWidget' file not found\n \n \n \n ... в Qt 5.15 использовал метод\n \n \n QApplication::desktop()\n \n \n \n setGeometry(QApplication::desktop()-&gt;geometry().width() - 36 - width() + QApplication::desktop()-&gt;geometry().x(),\n QApplication::desktop()-&gt;geometry().height() - 56 - height() + QApplication::desktop()-&gt;geometry().y(),\n width(),\n height());\n\n \n На данный момент ошибка:\n \n popup.cpp:81:31: error: no member named 'desktop' in 'QApplication'\n \n \n \n В документации - метод\n \n \n QApplication::desktop()\n \n \n устарел - никак не могу понять какой метод использовать ?\n \n", "datePublished": "2021-08-06T16:22:47.831415+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div><a class="anchor" name="comment-2244"></a><div id="2244" class="card mb-3"><div class="card-header d-flex py-2"><a href=/en/users/2/><img loading="lazy" alt="Evgenii Legotckoi" class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" src="/media/cache/7a/08/7a0837c6eb199ca9af1a03ea5ccbfcbf.webp"></a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/2/">Evgenii Legotckoi</a> &rarr; <a class="text-muted" href="#comment-2218">Alexandru Codreanu</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-2244" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">Oct. 11, 2021, 11:50 a.m.</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p><strong> QApplication </strong> имеет метод <strong> screens() </strong> , который возвращает список экранов. А класс QScreen имеет методы <strong> geometry() </strong> и <strong> availableGeometry() </strong> . Можете попробовать через них добиться нужного результата. </p></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "Evgenii Legotckoi", "url": "/en/post/146/#comment-2244", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n \n QApplication\n \n имеет метод\n \n screens()\n \n , который возвращает список экранов. А класс QScreen имеет методы\n \n geometry()\n \n и\n \n availableGeometry()\n \n . Можете попробовать через них добиться нужного результата.\n \n", "datePublished": "2021-10-11T05:50:13.741454+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div><a class="anchor" name="comment-2670"></a><div id="2670" class="card mb-3"><div class="card-header d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/14403/>АН</a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/14403/">Алексей Николаев</a> &rarr; <a class="text-muted" href="#comment-791">magrif</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-2670" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">March 26, 2023, 7:04 p.m.</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p> Включите прозрачность в композит менеджере <strong> fly-admin-theme </strong> : fly-admin-theme -&gt;Эффекты и всё заработает. </p><p><a href="/users/14403/albums/photo/2060/"><img alt="" class="img-fluid" loading="lazy" src="/media/users/gauge_your_way/photos/photo.jpg"/></a></p></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "Алексей Николаев", "url": "/en/post/146/#comment-2670", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n Включите прозрачность в композит менеджере\n \n fly-admin-theme\n \n : fly-admin-theme -&gt;Эффекты и всё заработает.\n \n \n \n \n \n \n", "datePublished": "2023-03-26T13:04:36.741562+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div><a class="anchor" name="comment-2671"></a><div id="2671" class="card mb-3"><div class="card-header d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/14403/>АН</a><div class="ms-3"><ul class="list-inline mb-0"><li class="list-inline-item"><a rel="author" href="/en/users/14403/">Алексей Николаев</a></li><li class="list-inline-item"><a href="/en/post/146/#comment-2671" title="Link to comment">#</a></li></ul><ul class="list-inline mb-0"><li class="list-inline-item me-2"><small class="text-secondary">March 26, 2023, 7:10 p.m.</small></li><li id='post_lastmod_2671' class="list-inline-item me-2" title="March 26, 2023, 7:10 p.m."><small class="text-secondary">(edited)</small></li></ul></div></div><div class="card-body"><div class="mb-3"><p> Добрый день, взял за основу ваш <strong> PopUp notification </strong> , и немного доработал его под свои нужды. <br/> Добавил в отдельном eventloop'e всплывающую очередь уведомлений с анимацией и таймером удаления. <br/> С вашего позволения оставляю здесь ссылку на <a href="https://github.com/aint-no-programmer/PopupMessageBox" rel="nofollow"> git </a></p></div></div><div class="card-footer"><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can add to favorites"><i class="bi bi-bookmark me-1"></i>0</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-up-fill me-1"></i>1</div><div class="btn btn-sm btn-light" onclick="Global.nonlogin()" title="Only registered users can rate"><i class="bi bi-hand-thumbs-down-fill me-1"></i>0</div></div><script type="application/ld+json">{"@context": "http://schema.org", "@type": "Comment", "author": "Алексей Николаев", "url": "/en/post/146/#comment-2671", "name": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "headline": "Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt", "description": "\n \n Добрый день, взял за основу ваш\n \n PopUp notification\n \n , и немного доработал его под свои нужды.\n \n Добавил в отдельном eventloop'e всплывающую очередь уведомлений с анимацией и таймером удаления.\n \n С вашего позволения оставляю здесь ссылку на\n \n git\n \n \n", "datePublished": "2023-03-26T13:10:18.227523+00:00", "interactionStatistic": [{"@type": "InteractionCounter", "interactionType": "BookmarkAction", "userInteractionCount": 0}, {"@type": "InteractionCounter", "interactionType": "LikeAction", "userInteractionCount": 1}, {"@type": "InteractionCounter", "interactionType": "DislikeAction", "userInteractionCount": 0}]}</script></div></div><div class="card card-warning m-3 "><div class="card-header bg-warning"><h3 class="card-title mb-0">Comments</h3></div><div class="card-body"> Only authorized users can post comments.<br/>Please, <a href="/en/accounts/login/">Log in</a> or <a href="/en/accounts/register/">Sign up</a></div></div></div></div><div class="col-12 col-lg-auto"><div class="sidebar sidebar-lg sticky-lg-top mb-3"><div class="list-group mb-3"><div class="list-group-item list-group-item-primary"><strong>Actions</strong></div><a None href="/en/knowledge/article/add/" class="list-group-item list-group-item-action"><span>Write article</span></a><a None href="/en/forum/create_topic/" class="list-group-item list-group-item-action"><span>Ask a question</span></a><a None href="/en/forum/create_topic/" class="list-group-item list-group-item-action"><span>Take the test</span></a><a None href="/en/sharecode/create/" class="list-group-item list-group-item-action"><span>Share code</span></a></div><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8160668332851230" crossorigin="anonymous"></script><!-- EVILEG SIDEBAR TOP --><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-8160668332851230" data-ad-slot="8743063287" data-ad-format="auto" data-full-width-responsive="true"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script></div></div></div><div class="row"><div class="col-12 col-lg overflow-hidden"><ul class="list-group mb-3"><li class="list-group-item list-group-item-primary"><strong>Last passed tests</strong></li><li class="list-group-item"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/18456/>АА</a><div class="ms-3"><div><a href="/en/users/18456/" class="text-decoration-none">Антон Арнст</a></div><small class="text-secondary">March 14, 2025, 1:48 p.m.</small></div></div><div class="mb-3"><div><a href="/en/tests/t/9/">Qt - Test 001. Signals and slots</a></div><div><strong>Result:</strong> 68 points</div><div><span class="text-danger">Test is not passed</span></div></div></li><li class="list-group-item"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/18456/>АА</a><div class="ms-3"><div><a href="/en/users/18456/" class="text-decoration-none">Антон Арнст</a></div><small class="text-secondary">March 14, 2025, 1:43 p.m.</small></div></div><div class="mb-3"><div><a href="/en/tests/t/1/">C++ - Test 001. The first program and data types</a></div><div><strong>Result:</strong> 60 points</div><div><span class="text-danger">Test is not passed</span></div></div></li><li class="list-group-item"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/18450/>K</a><div class="ms-3"><div><a href="/en/users/18450/" class="text-decoration-none">Korabel</a></div><small class="text-secondary">March 12, 2025, 7:33 p.m.</small></div></div><div class="mb-3"><div><a href="/en/tests/t/9/">Qt - Test 001. Signals and slots</a></div><div><strong>Result:</strong> 63 points</div><div><span class="text-danger">Test is not passed</span></div></div></li></ul><ul class="list-group mb-3"><li class="list-group-item list-group-item-primary"><strong>Last comments</strong></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a href=/en/users/2/><img loading="lazy" alt="Evgenii Legotckoi" class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" src="/media/cache/7a/08/7a0837c6eb199ca9af1a03ea5ccbfcbf.webp"></a><div class="ms-3"><div><a href="/en/users/2/" class="text-decoration-none">Evgenii Legotckoi</a></div><small class="text-secondary">March 9, 2025, 9:02 p.m.</small></div></div><div><a href="/en/post/193/#comment-2844">QML - Lesson 020. Introduction to Android Manifest in Qt Creator</a></div><div class="text-break"> К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…</div></div></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/15549/>VP</a><div class="ms-3"><div><a href="/en/users/15549/" class="text-decoration-none">Viktor Pathfinder</a></div><small class="text-secondary">March 9, 2025, 4:14 p.m.</small></div></div><div><a href="/en/post/193/#comment-2843">QML - Lesson 020. Introduction to Android Manifest in Qt Creator</a></div><div class="text-break"> Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…</div></div></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/1217/>ИМ</a><div class="ms-3"><div><a href="/en/users/1217/" class="text-decoration-none">Игорь Максимов</a></div><small class="text-secondary">Nov. 22, 2024, 9:51 p.m.</small></div></div><div><a href="/en/post/203/#comment-2842">Django - Tutorial 017. Customize the login page to Django</a></div><div class="text-break"> Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…</div></div></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a href=/en/users/2/><img loading="lazy" alt="Evgenii Legotckoi" class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" src="/media/cache/7a/08/7a0837c6eb199ca9af1a03ea5ccbfcbf.webp"></a><div class="ms-3"><div><a href="/en/users/2/" class="text-decoration-none">Evgenii Legotckoi</a></div><small class="text-secondary">Oct. 31, 2024, 11:37 p.m.</small></div></div><div><a href="/en/post/729/#comment-2751">Django - Lesson 064. How to write a Python Markdown extension</a></div><div class="text-break"> Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup </div></div></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/17869/>A</a><div class="ms-3"><div><a href="/en/users/17869/" class="text-decoration-none">ALO1ZE</a></div><small class="text-secondary">Oct. 19, 2024, 5:19 p.m.</small></div></div><div><a href="/en/post/485/#comment-2750">Fb3 file reader on Qt Creator</a></div><div class="text-break"> Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html </div></div></li></ul><ul class="list-group mb-3"><li class="list-group-item list-group-item-primary"><strong>Now discuss on the forum</strong></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/18263/>f</a><div class="ms-3"><div><a href="/en/users/18263/" class="text-decoration-none">firstlunoxod</a></div><small class="text-secondary">Feb. 15, 2025, 1:46 p.m.</small></div></div><div><a href="/en/forum/topic/218/#post-9885">Рисование на QGraphicsScene при зажатой кнопке мыши</a></div><div class="text-break"> Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене? </div></div></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a href=/en/users/2417/><img loading="lazy" alt="Дмитрий" class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" src="/media/cache/7f/2a/7f2a7c6416eb74fb21e8506c0ed78532.webp"></a><div class="ms-3"><div><a href="/en/users/2417/" class="text-decoration-none">Дмитрий</a></div><small class="text-secondary">Feb. 3, 2025, 4:24 p.m.</small></div></div><div><a href="/en/forum/topic/1920/">Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета?</a></div><div class="text-break"> Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…</div></div></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/18202/>NW</a><div class="ms-3"><div><a href="/en/users/18202/" class="text-decoration-none">Nayo Wai</a></div><small class="text-secondary">Jan. 30, 2025, 7:22 p.m.</small></div></div><div><a href="/en/forum/topic/1919/">не запускается компьютер!!!</a></div><div class="text-break"> Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…</div></div></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/12748/>n</a><div class="ms-3"><div><a href="/en/users/12748/" class="text-decoration-none">nkly</a></div><small class="text-secondary">Jan. 3, 2025, 12:52 p.m.</small></div></div><div><a href="/en/forum/topic/1909/#post-9884">Нужно запретить перемещение только некоторых итемов, остальные перемещать можно.</a></div><div class="text-break"> Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event-&gt;position().toPoint()) представления QTreeViev вызываемой в переопр…</div></div></li><li class="list-group-item"><div class="py-2"><div class="d-flex py-2"><a class="bg-secondary bg-opacity-10 rounded avatar-initials avatar-48" href=/en/users/15590/>M</a><div class="ms-3"><div><a href="/en/users/15590/" class="text-decoration-none">Marsel</a></div><small class="text-secondary">Aug. 17, 2023, 12:26 a.m.</small></div></div><div><a href="/en/forum/topic/1850/#post-9711">OAuth2.0 через VK, получение email</a></div><div class="text-break"> Спасибо большое за помощь и простите за то что отнял время своей невнимательностью. </div></div></li></ul></div><div class="col-12 col-lg-auto"><div class="sidebar sidebar-lg sticky-lg-top mb-3"><div class="sidebar sidebar-lg sticky-top"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8160668332851230" crossorigin="anonymous"></script><!-- EVILEG SIDEBAR BOTTOM --><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-8160668332851230" data-ad-slot="3079673067" data-ad-format="auto" data-full-width-responsive="true"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script></div></div></div></div></main><div class="container-xxl"><footer class="py-5"><div class="row"><div class="col-6 col-md-3 mb-3"><h5>About us</h5><ul class="nav flex-column"><li class="nav-item mb-2"><a class="nav-link p-0 text-body-secondary" href="/en/pages/">About us</a></li><li class="nav-item mb-2"><a class="nav-link p-0 text-body-secondary" href="/en/pages/rules/privacy-policy/">Privacy Policy</a></li><li class="nav-item mb-2"><a class="nav-link p-0 text-body-secondary" href="/en/pages/contacts/">Contacts</a></li><li class="nav-item mb-2"><a class="nav-link p-0 text-body-secondary" href="/en/pages/donate/">Donate</a></li><li class="nav-item mb-2"><a class="nav-link p-0 text-body-secondary" href="/en/pages/for-advertisers/">For advertisers</a></li></ul></div><div class="col-6 col-md-3 mb-3"><h5>Follow us in social networks</h5><ul class="nav flex-column"><li class="nav-item mb-2"><a class="nav-link p-0 text-body-secondary" href="https://vk.com/evileg" target="_blank" rel="noindex nofollow">VKontakte</a></li><li class="nav-item mb-2"><a class="nav-link p-0 text-body-secondary" href="https://t.me/evileg_ru" target="_blank" rel="noindex nofollow">Telegram</a></li><li class="nav-item mb-2"><a class="nav-link p-0 text-body-secondary" href="https://www.reddit.com/r/Evileg/" target="_blank" rel="noindex nofollow">Reddit</a></li></ul></div><div class="col-6 mb-3"><ul class="nav flex-column"><li class="nav-item mb-2">We recommend VSD hosting <a class="nav-link p-0" href="http://timeweb.com/ru/?i=27415&utm_source=evileg&utm_medium=footer&utm_campaign=timeweb" target="_blank" rel="noindex nofollow">Timeweb</a></li></ul></div></div><div class="d-flex flex-column flex-sm-row justify-content-between py-4 my-4 border-top"><p>© 2015-2025, Evgenii Legotckoi</p><ul class="list-unstyled d-flex"><li class="ms-3"><a class="link-body-emphasis" href="https://t.me/evileg_ru" target="_blank" rel="noindex nofollow"><i class="bi bi-telegram" style="font-size: 2rem;"></i></a></li><li class="ms-3"><a class="link-body-emphasis" href="https://www.reddit.com/r/Evileg/" target="_blank" rel="noindex nofollow"><i class="bi bi-reddit" style="font-size: 2rem;"></i></a></li></ul></div></footer></div><div id="menuModal" class="modal" tabindex="-1"><div class="modal-dialog modal-dialog-scrollable"><div class="modal-content"><div class="modal-header"><h5 class="modal-title">Actions</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body m-0 p-0"><div class="list-group list-group-flush"><a None href="/en/knowledge/article/add/" class="list-group-item list-group-item-action"><span>Write article</span></a><a None href="/en/forum/create_topic/" class="list-group-item list-group-item-action"><span>Ask a question</span></a><a None href="/en/forum/create_topic/" class="list-group-item list-group-item-action"><span>Take the test</span></a><a None href="/en/sharecode/create/" class="list-group-item list-group-item-action"><span>Share code</span></a></div></div></div></div></div><script async src="/static/js/run_prettify.js"></script><!-- Yandex.Metrika counter --><script type="text/javascript" > (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(39565770, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true }); </script><noscript><div><img src="https://mc.yandex.ru/watch/39565770" style="position:absolute; left:-9999px;" alt="" /></div></noscript><!-- /Yandex.Metrika counter --><!-- Yandex.RTB R-A-218837-50 --><script> window.addEventListener("load", () => { const render = (imageId) => { window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "renderTo": imageId, "blockId": "R-A-218837-50", "type": "inImage" }) }) } const renderInImage = (images) => { if (!images.length) { return } const image = images.shift() image.id = `yandex_rtb_R-A-218837-50-${Math.random().toString(16).slice(2)}` if (image.tagName === "IMG" && !image.complete) { image.addEventListener("load", () => { render(image.id) }, { once: true }) } else { render(image.id) } renderInImage(images) } renderInImage(Array.from(document.querySelectorAll("img"))) }, { once: true }) </script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10