بحاجة لتحقيق التطبيق لالمقدمة على ويندوز

StackOverflow https://stackoverflow.com/questions/204181

  •  03-07-2019
  •  | 
  •  

سؤال

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

وحاليا أنا باستخدام كيو تي في QWidget :: activateWindow () الذي يجمع أحيانا التطبيق إلى المقدمة، ولكن معظم الوقت الذي يسلط الضوء فقط البرنامج على شريط المهام.

ويمكن للشخص من فضلك قل لي كيفية القيام بذلك، ويفضل استخدام كيو تي على الرغم من تعذر ذلك باستخدام API WIN32 سيكون على ما يرام.


ولسوء الحظ، لم أتمكن من العثور على طريقة للقيام بذلك فقط مع كيو تي. I حلها باستخدام اقتراح كريس Becke في الدعوة SetForegroundWindow من التطبيق النشط حاليا.

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

المحلول

هل أنت متأكد أن هذا ليس مسألة التصحيح؟ هو، إذا كان تطبيق المقدمة، ويسمح الاتفاق لتغيير المقدمة.

والنقر على زر في نافذة وسيعطي أن تفعيل موضوع النوافذ الأمامية. إذا كان يدعو SetForegroundWindow (أو ما يعادلها) في إطار آخر، سيتم إعطاء هذا الإطار المقدمة.

إذا، من ناحية أخرى، فإنه ببساطة ترسل رسالة إلى التطبيق الآخر الذي يحاول SetForeground على نفسها، من شأنها أن تفشل. يستخدم AllowSetForegroundWindow في الحالات التي يحتاج 'إرث' التطبيق لإعطاء إذن - من خلال التطبيق الأمامي - لأخذ الصدارة. مرة أخرى، AllowSet ... لا تعمل إلا إذا طلبت من خيط التي تملك الإطار الأمامي النشط الحالي.

نصائح أخرى

في الجزء العلوي من طريقة QWidget::activateWindow، يجب عليك الاتصال QWidget::raise!

وهذا هو ما يقال هنا .

ولدي قضية مماثلة.

ولقد اثنين من التطبيقات كيو تي، A و B، والذي التواصل على مأخذ. أود أن تجلب نافذة التطبيق B تصل، من خلال زر على تطبيق A.

ولقد وجدت أنه في بعض الأحيان لا يتم تعيين حالة القطعة بشكل صحيح، وذلك في وظيفة event() من القطعة بلدي applicatons B وفعلت ما يلي:

bool MyWidgetB:event ( QEvent * e )
{
    QEvent::Type type = e->type ();

    // Somehow the correct state of window is not getting set,
    // so doing it manually
    if( e->type() == QEvent::Hide)
    {
        this->setWindowState(WindowMinimized);
    }
    else if( e->type() == QEvent::Show )
    {
        this->setWindowState((this->windowState() & ~WindowMinimized) |
                                 WindowActive);
    }
    return QWidget::event(e);
}

وانا إرسال أمر من تطبيق A إلى B. على تلقي ذلك، تطبيق B باستدعاء الدالة التالية على نفسه:

void BringUpWidget(QWidget* pWidget)
{
   pWidget ->showMinimized(); // This is to bring up the window if not minimized
                              // but beneath some other window

   pWidget ->setWindowState(Qt::WindowActive);
   pWidget ->showNormal();
}

وهذا يعمل بالنسبة لي، على ويندوز XP ، مع كيو تي 3.3. ويشتق بلدي MainWidget من QWidget.

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

لمثل هذه الحالة I تخزين وضع الطفل النوافذ وإخفائها، ثم استخدم وظيفة BringUpWidget لأحمل بلدي MainWindow القطعة، ثم استعادة الإطارات التابعة.

وهذا هو نوع من جبني، لكنه يعمل بالنسبة لي:

            this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
            this->show();
            this->setWindowFlags(Qt::FramelessWindowHint);
            this->show();

وأما إذا لم يكن لديك الأعلام الأخرى،

            this->setWindowFlags(Qt::WindowStaysOnTopHint);
            this->show();
            this->setWindowFlags(0);
            this->show();
سوف

وWindowStaysOnTopHint القوة دائما تقريبا النافذة إلى المقدمة. بعد ذلك، كنت لا تريد حقا نافذة للبقاء دائما على القمة، وذلك بإعادة تعيين إلى ما كانت الأعلام السابقة.

وأعتقد أن واجهات برمجة التطبيقات ما تحتاجه هي AllowSetForegroundWindow () و SetForegroundWindow () . أنا لا أعرف ما هي المكالمات كيو تي ما يعادلها.

استخدم showNormal () للانتقال من حالة إلى حالة ترميز التصميم مرئية.

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