2013-12-17 35 views
9

Birkaç pencereli bir uygulamam var. Her pencere ebeveynsiz bir QWidget'dir.QWidget'i geçerli uygulamanın üzerine ayarlayın, ancak başka bir uygulamada değil

O QWidget uygulamasının üst üzerine olmak istiyorum ama diğer uygulama üstünde. Visual Studio'daki pencereler gibi, örneğin serbest olduklarında. Ana pencere tarafından gizlenemezler, ancak başka bir uygulama ile olabilirler.

"setWindowFlags (Qt :: WindowStaysOnTopHint);", ancak QWidget'i tüm uygulamaların üstünde tutar.

+0

Şu anda qt yüklü değil, bu yüzden çok yardımcı olamıyorum, ama Qt :: Tool bayrak olarak denediniz mi? – Jepessen

+0

Denedim, işe yaramıyor. Qt belgesinde "Bir ebeveyn varsa, araç penceresi her zaman üstünde tutulur. Eğer ebeveyn yoksa, Qt :: WindowStaysOnTopHint'i de kullanabilirsiniz". Benimki de ebeveyn değil. – Nagawica

+0

ve bir ana uygulamanın widget'ları olduklarını düşünerek ebeveynleri olmamasının bir sebebi var mı? – Jepessen

cevap

6

WindowStayOnTopHint yerine SetWindowModality kullanın ve her ikisi de modal modes (Qt :: WindowModal ve Qt :: ApplicationModal) diğer uygulamaların modal pencerenizin üstünde olmasına izin verir.

LE: Sen QDialog en belgelere sayfa ApplicationModal ve WindowModal arasındaki fark hakkında daha fazla bilgi bulabilirsiniz here

LE 2: Sorun çözmek için, böylece bir üst ayarlamak kalmamasıdır Bu, her çocuk penceresi için bir ana (ana pencereniz hariç her şey) ayarlar ve her şey beklediğiniz gibi çalışır (alt pencereleri üst öğenin üstünde olur, ancak diğer uygulama pencerelerinin üstünde olmayacaktır):

int main(int argc, char** argv) 
{ 
    QApplication a(argc, argv); 

    QWidget w; 
    QVBoxLayout* layout = new QVBoxLayout(&w); 
    QPushButton* btn = new QPushButton("Show a non-modal window"); 
    layout->addWidget(btn); 
    QWidget* mainWindow = &w; 
    QObject::connect(btn, &QPushButton::clicked, [mainWindow]() 
     { 
      QWidget* dlg = new QWidget(mainWindow); 
      QVBoxLayout* dlgLayout = new QVBoxLayout(dlg); 
      dlg->setWindowFlags(Qt::Window); 
      QLabel* lbl = new QLabel("Non-modal window...", dlg); 
      dlgLayout->addWidget(lbl); 

      dlg->show(); 
     }); 
    w.show(); 
    return a.exec(); 
} 
+1

* ApplicationModal * ve * WindowModal * arasındaki fark, benim widget'larımın modası olmadığı durumlar haricinde neredeyse istediğim şeydir :-(Örneğin photoshop gibi bazı araçları göstermek için kullanılırlar. – Nagawica

+0

düzenlemeye bakın. her pencere için ana pencere olarak ana pencere – Zlatomir

+1

Üst öğeyi ayarlayın ve 'setWindowFlags (Qt :: Window) 'seçeneğini ekleyin, işi yapın gibi görünüyor.Teşekkür ederim! – Nagawica

0

kullandığım ve Qt 5.3.0

için çalıştık
setWindowFlags(Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint| Qt::Window); 

Qt :: Aracı da bu çağırmadan önce yerine QWindow
Ayrıca set Ana Ortaklık kullanılabilir. ve o güzel çalışacaktır

İlgili konular