使用控制台应用程序的 QDialog 没有任务栏条目
No taskbar entry for QDialog using console application
我正在 Linux 中使用 Qt Creator 4.6.0 编写 Qt 控制台应用程序。我想显示一个 QDialog 但我不希望它显示
- 在任务栏上显示条目,并且
- 从其他人那里窃取焦点 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;
}
我正在 Linux 中使用 Qt Creator 4.6.0 编写 Qt 控制台应用程序。我想显示一个 QDialog 但我不希望它显示
- 在任务栏上显示条目,并且
- 从其他人那里窃取焦点 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;
}