平台 - Windows 7,8,10
我已经从QMainWindow创建了一个QApplication。 我希望它始终位于所有其他窗口之上。
我使用Qt标志(Qt :: WindowStaysOnTopHint)来实现这一目标。 但是这个Qt标志不起作用。 该应用程序是一个无框架应用程序。
请在下面找到我的Qt App构造函数的代码。
myApp::myApp(QWidget *parent)
: QMainWindow(parent)
{
setWindowFlags(Qt::Widget | Qt::FramelessWindowHint);
setWindowFlags(this->windowFlags() | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint );
ui.setupUi(this);
}
如何让这个标志起作用?
我尝试了社区的几位成员提出的所有选项。 我现在的代码如下
Qt::WindowFlags flags = this->windowFlags();
this->setWindowFlags(flags | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
ui.setupUi(this);
奇怪的事实是,这在我的机器上永远不会起作用。 当我创建安装程序或复制所需的文件并在不同的计算机上运行时(Windows 7,8,10),我将我的应用程序放在所有其他窗口之上。 注意:我使用的是Visual Studio Community Edition 2015 操作系统 - Windows 7专业版Service Pack 1。
答案 0 :(得分:1)
以下代码最终让我保持窗口始终高于其他窗口
我还通过取消设置Minimize标志来阻止窗口的最小化选项。 但仍有一个问题。窗口的下半部分经过任务栏。我必须单击应用程序图标才能将下半部分放在任务栏上方。
答案 1 :(得分:0)
见:
http://doc.qt.io/qt-5/qt.html http://doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html
使用WindowStaysOnTopHint标志。来自Qt Doc:
“通知窗口系统窗口应该保持最重要 其他窗户。请注意,在X11上的某些窗口管理器上,您也有 传递Qt :: X11BypassWindowManagerHint使此标志起作用 正确“。
你的错是你分别为FramelessWindowHint和WindowStaysOnTopHint调用了setWindowFlags两次。尝试:
User.objects.filter(...).prefetch_related('user_group')
或者您可以使用Windows系统API:
Qt::WindowFlags flags = windowFlags();
setWindowFlags(flags | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint);
在.pro文件中:
#include <Windows.h>
....
SetForegroundWindow((HWND)winId());
setWindowFlags(Qt::WindowStaysOnTopHint);
答案 2 :(得分:0)
使窗口位于所有应用程序之上。
<强> myApp.h 强>
class myApp: public QMainWindow
{
Q_OBJECT
public:
explicit myApp(QWidget *parent = 0);
~myApp();
protected:
bool event(QEvent *event);
----
};
myApp.cpp
#include <windows.h>
#include <winuser.h>
myApp::myApp(QWidget *parent): QMainWindow(parent)
{
setWindowFlags(Qt::FramelessWindowHint |Qt::WindowStaysOnTopHint);
ui.setupUi(this);
}
bool myApp::event(QEvent *event){
switch (event->type())
{
case QEvent::Show:
{
HWND winHWND =(HWND) winId();
if( winHWND ){
qDebug() << endl << "Setting up associated console window ON TOP !";
SetWindowPos(
winHWND, // window handle
HWND_TOPMOST, // "handle to the window to precede
// the positioned window in the Z order
// OR one of the following:"
// HWND_BOTTOM or HWND_NOTOPMOST or HWND_TOP or HWND_TOPMOST
0, 0, // X, Y position of the window (in client coordinates)
0, 0, // cx, cy => width & height of the window in pixels
SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW // The window sizing and positioning flags.
);
// OPTIONAL ! - SET WINDOW'S "SHOW STATE"
ShowWindow(
winHWND, // window handle
SW_NORMAL // how the window is to be shown
// SW_NORMAL => "Activates and displays a window.
// If the window is minimized or maximized,
// the system restores it to its original size and position.
// An application should specify this flag
// when displaying the window for the first time."
);
qDebug() << endl << "Done.";
} else {
qDebug() << endl << "There is no console window associated with this app :(";
}
break;
}
default:
break;
}
return QMainWindow::event(event);
}
答案 3 :(得分:0)
您必须在setWindowFlags
ui.setupUi(this);
答案 4 :(得分:0)
在构造函数中写一行简单的代码。 (无需包含任何其他标题)
setWindowFlag(Qt::WindowStaysOnTopHint);