使用控制台应用程序的 QDialog 没有任务栏条目

No taskbar entry for QDialog using console application

我正在 Linux 中使用 Qt Creator 4.6.0 编写 Qt 控制台应用程序。我想显示一个 QDialog 但我不希望它显示

  1. 在任务栏上显示条目,并且
  2. 从其他人那里窃取焦点 windows。

我该怎么做?

我发现了类似的问题,但是 对我不起作用,因为我似乎无法在控制台应用程序中使用 this

这是我目前所拥有的显示对话框的内容,但它既没有从任务栏中隐藏它,也没有阻止它窃取焦点:

    QDialog splash;
    QVBoxLayout *laySplash = new QVBoxLayout(&splash);
    splash.setAttribute(Qt::WA_ShowWithoutActivating);
    splash.setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    QLabel *lblText = new QLabel;
    laySplash->addWidget(lblText);
    lblText->setText(QString::fromStdString("test"));
    QTimer::singleShot(1000, &splash, SLOT(close()));
    splash.exec();

带有 exec() 的设置参数似乎 矛盾 并且不会阻止显示 阻塞 窃取焦点的模式对话框,如果您只是 show() 对话框而不是 exec(),其他设置有效。下面的代码在 Debian Ubuntu 17.10 上进行了测试,并取得了预期的结果

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //
    QDialog splash;
    QVBoxLayout *laySplash = new QVBoxLayout(&splash);
    splash.setAttribute(Qt::WA_ShowWithoutActivating);
    splash.setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    QLabel *lblText = new QLabel;
    laySplash->addWidget(lblText);
    lblText->setText(QString::fromStdString("test"));
    QTimer::singleShot(5000, &splash, SLOT(close()));
    splash.show();
    //
    return a.exec();
}

更新:

如果代码应该在主事件循环之前或没有主事件循环(在调用 a.exec() 之前,甚至根本不调用 a.exec())工作,则需要进入事件循环来托管对话框, 这可以分别重复每个附加代码;最终您可能会根据您的代码选择 return 任何 int 值。

#include <QEventLoop>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //
    QDialog splash;
    QVBoxLayout *laySplash = new QVBoxLayout(&splash);
    splash.setAttribute(Qt::WA_ShowWithoutActivating);
    splash.setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    QLabel *lblText = new QLabel;
    laySplash->addWidget(lblText);
    lblText->setText(QString::fromStdString("test"));
    QEventLoop ev;
    splash.show();
    QTimer::singleShot(5000, &ev, &QEventLoop::quit);
    ev.exec();
    //
    // More code .. more event loops
    //
    return 0;
}