سؤال

لدي ثلاثة QDockWidgets والتي يتم تبويبها عند بدء التشغيل باستخدام QMainWindow.tabifyDockWidget.

في النافذة الرئيسية، بعد كل addDockWidget المكالمات:

self.tabifyDockWidget(self.dock_widget1, self.dock_widget2)
self.tabifyDockWidget(self.dock_widget1, self.dock_widget3)

بناءً على إجراءات معينة، أرغب في تحديد إحدى علامات التبويب هذه والتركيز عليها، أو فوق العلامتين الأخريين، إذا لم تكن مرئية بالفعل.لقد حاولت استخدام setVisible و setWindowState(Qt.WindowActive), ولكن لا شيء يتغير.

هل هناك طريقة لتحديد عنصر واجهة المستخدم المبوب برمجيًا وإحضاره إلى المقدمة؟

هل كانت مفيدة؟

المحلول

بفضل الإجابة على القائمة البريدية لـ qt-interest، أصبح من السهل جدًا القيام بذلك QWidget.raise():

http://qt-project.org/doc/qt-4.8/qwidget.html#raise

في PyQt، إنه كذلك QWidget.raise_():

http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#raise

نصائح أخرى

لي:

dock2.show();

dock2.raise();

كان كافيا.لكن نعم، كلاهما مطلوب!

لم أختبر هذا، ولكن إليك ما سأحاول تجربته في Qt 4.5+ (سأترك لك تحويل PyQt):

class MyMainWindow ; // A QMainWindow

void MyMainWindow::bringToFront( QDockWidget* dockIn )
{
   QList<QDockWidget*> docks = tabifiedDockWidgets( dockIn ) ;
   foreach( QDockWidget* dock, docks )
   {
      // Move second dock on top of first dock widget.
      tabifyDockWidget( dock, dockIn ) ;
   }
}

يرى QMainWindow::tabifiedDockWidgets() و QMainWindow::tabifyDockWidget().

هذا لم ينجح بالنسبة لي:

dock2.raise_() 

تمكنت من تشغيله باستخدام:

dock2.show()
parent.tabifyDockWidget(dock1, dock2)

إذا كنت تبحث عن حل لتعيين التركيز على الأداة وعدم تركها على QDockWidget المبوبة في الخلفية، فيمكنك استخدام إشارة تغير الرؤية و أ وكيل التركيز مثله:

class Dock(QDockWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.visibilityChanged.connect(self.setVisibility)

    def setVisibility(self, visible):
        if visible: self.setFocus()

    def setWidget(self, widget:QWidget):
        super().setWidget(widget)
        self.setFocusProxy(widget)

مثال عملي صغير:

app = QApplication([])
main = QMainWindow()
dock1 = Dock('Dock1', main )
dock1.setWidget(QTextEdit(dock1))
dock2 = Dock('Dock2', main )
dock2.setWidget(QTextEdit(dock2))
main.addDockWidget(Qt.LeftDockWidgetArea, dock1)
main.tabifyDockWidget(dock1, dock2)
main.show()
app.exec()

الحل الذي يعمل بالنسبة لي هو:

tabifyDockWidget(dock1, dock2)
dock2.setVisible(True)
dock2.setFocus()
dock2.raise_()

يبدو أن هذه الوظائف الثلاث ضرورية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top