سؤال

لدي QMainWindow.لديها هذه المعايير:

this->setWindowFlags(Qt::Tool);
this->setFocusPolicy(Qt::StrongFocus);
this->setAttribute(Qt::WA_QuitOnClose,true);

بعد showEvent calles نافذتي هو مبين ولكن unactivated.حاولت الزائد عرض وظيفة:

...    
QMainWindow::showEvent(event);
this->activateWindow();
...

ولكن هذا لا يساعدني.

تحرير: عندما علق الخط

this->setWindowFlags(Qt::Tool);

كل شيء يعمل على ما يرام ، ولكن أحتاج في أداة العلم.أي أفكار ؟

تحرير:

  • نظام التشغيل:لينكس
  • لغة البرمجة:c++
  • Qt الإصدار:4.5.1
هل كانت مفيدة؟

المحلول

ويندوز مدير تقرر

قبل أن أبدأ:كما أشار elcuco و خافيير, تركز السياسة والجوانب الأخرى من ويندوز تخطيط (مثلا ، شريط العنوان) ينتمي إلى مجموعة كبيرة تمتد إلى كل من مدير ويندوز و Qt قد سيطرة محدودة.أن ترى هذا مجرد إلقاء نظرة على واجهة المستخدم الذي لديه "التركيز يتبع الماوس"السياسة.في هذه الحالات ، مدير ويندوز قد تجاهل Qt التركيز الطلب.لهذه الأسباب, Qt الوثائق مكالمات كثيرة منها الأعلام "تلميحات".وبالتالي فإن بعض الحلول المقترحة قد أو قد لا عمل لك.

QApplication::setActiveWindow()

هذه لا تحمل ، هـ.tadeu هو الحل استخدام QApplication::setActiveWindow() يعمل بالنسبة لي لكل من ويندوز وأوبونتو مع جنوم.لقد اختبرت ذلك مع التعليمات البرمجية التالية.الاعتذار الذي هو الثعبان باستخدام PyQt (يمكنني استخدام مثل هذه الأسئلة إلى معرفة بعض الشيء عن 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() هاك

إذا كان هذا لا يعمل بالنسبة لك ، الإختراق التالية قد.أنا افترض أن لديك نافذة في التطبيق النشط.ثم يمكنك استخدام 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.أنها ليست لطيفة, أعلم...

إنشاء الخاصة بك نافذة

يمكنك الحصول على الأكثر مرونة (وخلق أكثر من العمل لنفسك) من قبل المتداول خارج النافذة الخاصة بك تخطيط.على فكرة هو موضح في التالي أسئلة وأجوبة.

أخرى "الحلول"

يمكنك الاتصال مباشرة كل نافذة مدير دالة API للحصول على النتيجة المرجوة (واضح جدا سبب استخدام Qt في المقام الأول).هل يمكن أيضا هاك كيو تي التعليمات البرمجية المصدر.على سبيل المثال ، على ويندوز, Qt يستخدم ShowWindow() وظيفة مع SW_SHOWNOACTIVATE العلم أن تظهر نافذة مع نمط WS_EX_TOOLWINDOW إذا قمت بتعيين Qt::Tool العلم.يمكنك بسهولة استبدال SW_SHOWNOACTIVATE مع ما تريد.لينكس يجب أن تكون هي نفسها.ومن الواضح أيضا ليس من المستحسن.

نصائح أخرى

محاولة استخدام QApplication::setActiveWindow()

أبل الأصلي واجهة الإنسان التوجيهية(*) قال صندوق أدوات النوافذ كانت "دائما في القمة ولكن لم يتم تنشيط".كما تنصح باستخدام مربعات النص عليها ، على وجه التحديد بسبب عدم تفعيل الدولة المرتدة.

التحقق من كيفية أخرى 'الأدوات الثقيلة' تطبيقات التصرف.أنا بضعف يذكر أن ما لا يقل عن GIMP و إنكسكيب تبدو مختلفة جدا في هذا الجانب.

كما elcuco قال مدير النافذة تستطيع أن تفعل ما تريد مع "كيو تي" الأعلام.أيضا, بالتأكيد ستكون مختلفة تحت KDE, Gnome, fluxbox, أيا كان.

(*):عظيم الوثيقة!إلى حد ما قديمة ؛ ولكن أداة ويندوز استخدمت بالفعل و تعتبر

وهو نظام التشغيل ؟ التي Qt4?

على لينكس محكوم ، مدير النافذة يمكن تجاهل ما كنت تقول له.يبقيه قيد النظر.

يفعل الشيء نفسه يحدث إذا كنت فقط جعله العادية QWidget بدلا من QMainWindow?

أيضا, ربما قد يكون من الأفضل محاولة لتحقيق كل ما تأثير عليك Qt::أداة بوسائل أخرى إذا كان ذلك ممكنا ؟

فيما يتعلق Qt::أداة WindowFlags أن أقتبس Qt الوثائق

يشير إلى أن القطعة هي أداة نافذة.أداة نافذة غالبا ما تكون صغيرة نافذة مع أصغر من المعتاد العنوان شريط الديكور, عادة ما تستخدم مجموعات أداة أزرار.هناك هو أحد الوالدين ، أداة نافذة دائما أن تبقى على أعلى من ذلك.إذا كان هناك لا أحد الوالدين ، قد تنظر في استخدام Qt::WindowStaysOnTopHint كذلك.إذا نظام النافذة يدعم ذلك ، أداة نافذة يمكن أن تكون مزينة إلى حد ما أخف الإطار.فإنه يمكن أيضا أن تكون جنبا إلى جنب مع Qt::FramelessWindowHint

يبدو أعلام مشكلة باستخدام Qt::WindowStaysOnTopHint يجب حل المشكلة الخاصة بك.

فقط اتصل show() بعد setWindowFlags().

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