2016-03-31 22 views
1

Bir ana pencereye ve bir diyalog açma olasılığına (soru, hata vb.) Sahip bir uygulama oluşturdum. Ben QMessageBox.warning() veya QMessageBox.question() kullanmıyorum ve böylece iletişim kutularını biraz özelleştirmek istedim.PySide make QDialog ana pencerede görünür

Ancak, yeni bir İletişim Kutusu açtığımda, Windows görev çubuğunda (Windows 10 üzerinde çalışıyorum) yeni bir 'sekme' açılır ve bu biraz rahatsız edici olur.

enter image description here

Kodum (kısaltılmış):

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_()) 

Not: Normalde, iletişim bir menü veya düğmeden denir.

Soru: Yeni bir 'görev çubuğu sekmesi' oluşturmadan iletişim penceresini ana pencerede nasıl görüntüleyebilirim?

+0

bu http://stackoverflow.com/a/9043996/4941927 adresine bakın, size yardımcı olabilir – Milor123

+0

@ Milor123 Teşekkürler, bunu zaten böyle yapıyorum. Düğme 'self.mybutton.clicked.connect (self.myfunc)' kullanılarak bağlanır. 'Myfunc'de,' MessageBox ("Title", "Mesajım burada") 'ifadesi kullanılarak diyalog çağrılır. Herhangi bir fikir? – linusg

+0

Bir sınıf oluşturmanın ve yapıcıdaki tüm işi (sınıfınızı genişletmek için miras kalıyorsunuz, yoksa sadece bir işlev mi yaratıyorsunuz?) Yapmanın çok anlamlı olmadığı gerçeğinin yanı sıra, Odak ve pencere gruplamanın doğru şekilde çalışmasını sağlamak için ana iletişim kutusuna yeni iletişim kutusu. –

cevap

1

Çözüm oldukça basitti: QDialog kurucusuna QMainWindow bir başvuru geçirilmesi işi, örneğin yapacak:

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

ve sonra QMainWindow devralan bir sınıftan iletişim çağırarak:

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) 

Belki bu herkese yardımcı olur!

+0

Cevabımı neden kopyaladın? –

+0

@BrendanAbel Özür dilerim, 'super (MessageBox, self) .__ init __ (ana) 've' QtGui.QMessageBox (ana) 'nin aynı olmadığını düşündüm. Cevabımı biraz belirleyeceğim ve seninkini deneyeceğim, tamam mı? – linusg

+0

Peki, cevabımı QDialog'dan tavsiye edilen alt sınıflama olarak düşünürsek, ve sonunda yaptığınız şey bu, çözümümüzü denediniz. –

0

Pencereye QDialog ebeveyini ayarlarsanız, görev çubuğunda yalnızca bir öğe olarak görünür. Bu genellikle QMessageBox ilk argümanıdır. Eğer gerçekten özel bir iletişim kutusu oluşturmak istiyorsanız

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

Ayrıca, sen QDialog yanı sadece alt sınıf olabilir.