2017-03-05 221 views
1

下面是如何使对话框弹出使用“WindowStaysOnTopHint”,显示自己凌驾于所有其他窗口一个PyQt的例子:如何使PySide窗口弹出其他窗口之上

#copied from: http://stackoverflow.com/questions/1925015/pyqt-always-on-top 
import sys 
from PyQt4 import QtGui, QtCore 

class mymainwindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint) 

app = QtGui.QApplication(sys.argv) 
mywindow = mymainwindow() 
mywindow.show() 
app.exec_() 

的'WindowStaysOnTopHint'属性似乎是让窗口在所有其他窗口之上弹出的关键。但我不知道如何使用“WindowStaysOnTopHint”属性来获取“文件夹实用程序”窗口(在下面的脚本中)弹出,显示在所有其他窗口之上。 我尝试在self.initUI()附近插入几个选项​​,如下所示,但没有在“其他窗口”上方弹出“Folder Utility”窗口(在下面的脚本中)。

这里的脚本:

import os 
import sys 
# Based on 'http://stackoverflow.com/questions/22363123/pyside-get-directory-selected', but with many changes I made 
from PySide import QtCore 
from PySide import QtGui 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 

     #self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint) 
     #flags = QtCore.Qt.WindowFlags()# The line above prevented the 
      # window from appearing at all 
     #flags |= QtCore.Qt.WindowStaysOnTopHint # This line and the line 
      # above had no effect. 

     self.initUI() 
     self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint) 

    def initUI(self): 

     QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10)) 

     self.setToolTip('This is a <b>QWidget</b> widget') 

     # EditText Field 
     labelNuDirName = QtGui.QLabel('New Folder Name:', self) 
     labelNuDirName.move(15, 10) 

     self.etNuDirName = QtGui.QLineEdit('', self) 
     self.etNuDirName.resize(self.etNuDirName.sizeHint()) 

     self.etNuDirName.move(110, 7) 

     # Folder Browser 
     lbBroswer = QtGui.QLabel('Directory:', self) 
     lbBroswer.move(15, 40) 

     self.etBrowser = QtGui.QLineEdit('', self) 
     self.etBrowser.resize(210,20)#width, height https://srinikom.github.io/pyside-docs/PySide/QtGui/QWidget.html#PySide.QtGui.PySide.QtGui.QWidget.resize 
     self.etBrowser.move(90, 37) 
     self.etBrowser.setEnabled(0) 
     # self.etBrowser.isReadOnly = 0 

     btnBrowse = QtGui.QPushButton('...', self) 
     btnBrowse.setToolTip('Select directory ...') 
     btnBrowse.resize(30,20) 
     btnBrowse.move(305, 37) 
     btnBrowse.clicked.connect(self.selectDirectory) 

     # Button UI 
     btn = QtGui.QPushButton('Create Folder', self) 
     btn.setToolTip('This creates the folders.') 
     btn.resize(btn.sizeHint()) 
     btn.move(5, 60)  
     btn.clicked.connect(self.generateFolders) 

     ###Folder Selected Show 
#  label_NuDirSelected = QtGui.QLabel('', self) 
#  self.etNuDirName.resize(210,20)#width, height https://srinikom.github.io/pyside-docs/PySide/QtGui/QWidget.html#PySide.QtGui.PySide.QtGui.QWidget.resize 
#  lbBroswer.move(5, 80) 

     self.resize(350, 150) 
     self.center() 

     self.setWindowTitle('Folder Utility')  
     self.show() 

    def center(self): 

     qr = self.frameGeometry() 
     cp = QtGui.QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 


    def selectDirectory(self): 

     dialog = QtGui.QFileDialog 
     selected_directory = dialog.getExistingDirectory(None, 
                   title, 
                   startingDir, 
                   QtGui.QFileDialog.ShowDirsOnly)  
     # Use the selected directory... 
     self.etBrowser.setText(selected_directory) 
     print 'selected_directory:', selected_directory 
#  txt4__label_NuDirSelected = 'Directory you selected = "' + selected_directory + '"' 
#  self.label_NuDirSelected.setText(txt4__label_NuDirSelected) 


    def generateFolders(self): 

     existing_directory = self.etBrowser.text() 
     NuDirName = self.etNuDirName.text() 

     filePath = str(existing_directory) + os.sep + str(NuDirName) 

     if not os.path.exists(filePath): 
      os.makedirs(filePath) 

     if os.path.exists(filePath): 
      print 'Successfully Created Folders!' 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+1

静态函数使用本机对话框,该对话框无法控制。使用'QFileDialog'构造函数[创建非本地对话框](https://doc.qt.io/qt-4.8/qfiledialog.html#details)。 – ekhumoro

+0

感谢您提供该非常有用的网址。我从你的回应推断,我的长代码示例问题中的窗口是一个“静态函数”窗口,而“WindowStaysOnTopHint”不适用于这样的窗口。你知道在哪里可以找到如何在所有其他窗口之上弹出“静态函数”窗口?而且,我在哪里可以找到有关“静态函数”窗口的信息?并再次感谢您的慷慨帮助。 – user235218

+0

正如我所说:没有办法控制本地(即非Qt)对话框。 – ekhumoro

回答

1

我想我现在看到问题的所在。无论何时您重置窗口标志,Qt也会在内部调用setParent() - 然后隐藏该窗口。因此,在致电setWindowFlags()后,您必须始终明确地致电show()

self.initUI()(它调用show()最后Example.__init__()。或从initIU中删除self.show(),并在main()中添加行ex.show()

+0

非常感谢你! – user235218