我有一个QMainWindow。它有这个参数:
this->setWindowFlags(Qt::Tool); this->setFocusPolicy(Qt::StrongFocus); this->setAttribute(Qt::WA_QuitOnClose,true);
showEvent calles后,我的窗口显示但未激活。 我试图重载show function:
...
QMainWindow::showEvent(event);
this->activateWindow();
...
但它对我没有帮助。
修改 当我评论行
this->setWindowFlags(Qt::Tool);
一切正常,但我需要工具标志。 有什么想法吗?
修改
答案 0 :(得分:14)
Windows Manager决定
在开始之前:正如elcuco和Javier所指出的,焦点策略和Windows布局的其他方面(例如标题栏)属于相应的窗口管理器,并且Qt的控制可能有限。要查看此内容,只需查看具有“focus follows mouse”策略的用户界面即可。在这些情况下,Windows管理器可能会忽略Qt的焦点请求。出于这个原因,Qt文档调用了许多相应的标志“提示”。因此,某些建议的解决方案可能适用于您,也可能不适合您。
<强>的QApplication :: setActiveWindow()就强>
这是不可能的,e.tadeu's使用QApplication::setActiveWindow()
的解决方案适用于Windows和Unntu与Gnome。我用以下代码测试了它。抱歉使用PyQt是Python(我使用这些问题来了解PyQt)。你应该很容易阅读并将其翻译成C ++。
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
# main window
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Test')
# text editor
self.textEdit = QtGui.QTextEdit()
self.setCentralWidget(self.textEdit)
def closeEvent(self, event):
QtGui.QApplication.instance().quit()
#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow.show()
app.setActiveWindow(testWindow)
app.exec_()
请注意,您必须添加对testWindow
的关闭事件的一些处理,因为如果您关闭Qt::Tool
窗口,应用程序不会自动退出。
grabKeyboard()Hack
如果这对您不起作用,可能会出现以下黑客攻击。我假设您的应用程序中有一个活动窗口。然后,您可以使用grabKeyboard()
重定向输入。 Qt::Tool
窗口无法获得焦点,但会收到输入。以下主要代码演示了它(其他代码保持不变)。
#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow2 = MainWindow() # second window which is active
testWindow2.show()
testWindow.show()
testWindow.textEdit.grabKeyboard()
app.exec_()
基本上,当窗口testWindow2
是活动窗口时,输入的所有文本都显示在testWindow.textEdit
中。这不好,我知道......
创建自己的窗口
通过推出自己的窗口布局,您可以获得最大的灵活性(并为自己创造最多的工作)。这个想法在以下FAQ中描述。
其他“解决方案”
您可以直接调用相应的窗口管理器的API函数来获得所需的结果(显然与首先使用Qt的原因无关)。你也可以破解Qt源代码。例如,在Windows上,Qt使用ShowWindow()
函数和SW_SHOWNOACTIVATE
标志,如果设置Qt::Tool
标志,则显示样式为WS_EX_TOOLWINDOW
的窗口。您可以轻松地将SW_SHOWNOACTIVATE
替换为您想要的任何内容。 Linux应该是一样的。显然也不推荐。
答案 1 :(得分:4)
尝试使用QApplication :: setActiveWindow()
答案 2 :(得分:4)
最初的苹果人机界面指南(*)表示工具箱窗口“始终在顶部但从未激活”。它还建议不要在它们上使用文本框,正是因为缺乏激活状态反馈。
检查其他“工具箱重”应用的行为方式。我隐约记得至少GIMP和InkScape在这方面看起来非常不同。
正如elcuco所说,窗口管理器可以用Qt的标志做任何想做的事情。此外,它确实会在KDE,Gnome,fluxbox等之下有所不同。
(*):好文件!有点过时;但是工具窗口已经被使用并被认为是
答案 3 :(得分:1)
哪个操作系统?哪个Qt4?
在Linux上你注定要失败,窗口管理员可以忽略你告诉他的内容。保持正在考虑中。
答案 4 :(得分:0)
如果你只是把它变成普通的QWidget而不是QMainWindow,会发生同样的事情吗?
另外,也许您可能会更好地尝试通过其他方式实现您需要Qt :: Tool的任何效果,如果可能的话?
答案 5 :(得分:0)
关于Qt :: Tool WindowFlags引用Qt文档
表示窗口小部件是一个工具 窗口。工具窗口通常很小 比通常标题小的窗口 酒吧和装饰,通常用于 工具按钮的集合。它在那里 是父,工具窗口会 永远保持在它之上。如果有 不是父母,你可以考虑使用 Qt :: WindowStaysOnTopHint也是如此。如果 窗户系统支持它,一种工具 窗户可以装饰一个 更轻的框架。它也可以 结合Qt :: FramelessWindowHint
似乎标志是一个问题,使用Qt :: WindowStaysOnTopHint可以解决您的问题。
答案 6 :(得分:0)
只需在show()
之后致电setWindowFlags()
。