2016-03-31 47 views
1

私はメインウィンドウとダイアログ(質問、エラーなど)を開く可能性のあるアプリケーションを作成しました。私はQMessageBox.warning()またはQMessageBox.question()などを使用していません。私はダイアログを少しカスタマイズしたかったからです。PySideメインウィンドウにQDialogを表示します

しかし、新しいダイアログを開くたびに、Windowsのタスクバー(Windows 10で作業しています)に新しい「タブ」が開かれます。これはちょっと面倒です。

enter image description here

私のコード(短縮):

from PySide import QtCore, QtGui 
import sys 

class MessageBox: 
    def __init__(self, title, message): 
     msg = QtGui.QMessageBox() 
     flags = QtCore.Qt.Dialog 
     flags |= QtCore.Qt.CustomizeWindowHint 
     flags |= QtCore.Qt.WindowTitleHint 
     msg.setWindowFlags(flags) 
     msg.setWindowTitle(title) 
     msg.setText(message) 
     msg.exec_() 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.show() 

     MessageBox("Title", "My message here") 

if __name__ == "__main__": 
    app = QtGui.QApplication([]) 
    window = MainWindow() 
    sys.exit(app.exec_()) 

注:通常、ダイアログは、メニューやボタンから呼び出されます。

質問:新しい「タスクバータブ」を作成せずにダイアログをメインウィンドウに表示させるにはどうすればよいですか?

+0

これを参照してくださいhttp://stackoverflow.com/a/9043996/4941927、 – Milor123

+0

@ Milor123ありがとう、私はすでにこれのようにやっています。ボタンは 'self.mybutton.clicked.connect(self.myfunc)'を使って接続します。 'myfunc'では、ダイアログは' MessageBox( "Title"、 "My message here") 'を使って呼び出されます。何か案は? – linusg

+0

クラスを作成してコンストラクタ内のすべての作業を行うのは意味がありません(クラスを継承するか、関数を作成するだけですか?)。メインダイアログに新しいダイアログが表示され、フォーカスとウィンドウのグループ化が正しく機能します。 –

答えて

1

ソリューションは非常に簡単だった:QDialogのコンストラクタにQMainWindowの参照を渡すと、仕事をするだろう、例えば:

class MessageBox(QtGui.QDialog): 
    def __init__(self, parent, title, message, icon="info"): 
     super(MessageBox, self).__init__(parent) 
     ... 

、その後QMainWindowから継承したクラスからダイアログを呼び出す:

class MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 

     #connect button with function, e.g.: 
     mybutton.clicked.connect(self.open_dialog) 

    def open_dialog(self): 
     MessageBox(self) 

これは誰にでも役立つかもしれません!

+0

あなたは私の答えをなぜコピーしましたか? –

+0

@BrendanAbel申し訳ありません、私は 'super(MessageBox、self).__ init __(parent)'と 'QtGui.QMessageBox(parent)'は同じではないと思っています。私は私の答えを特定し、あなたのものを試してみるよ、よろしい? – linusg

+0

まあ、私の答えがQDialogからのサブクラス化を推奨し、それが最終的に何をしたのかを考えれば、私の解決策を試したようです。 –

0

QDialogの親をウィンドウに設定すると、タスクバーの1つのアイテムとしてのみ表示されます。これは一般的にQMessageBoxの最初の引数です。あなたが本当にカスタムダイアログを作成したい場合は

class MessageBox: 
    def __init__(self, parent, title, message): 
     msg = QtGui.QMessageBox(parent) 

また、あなたにもちょうどQDialogからサブクラスかもしれません。

関連する問題