2012-10-29 7 views
16

मैं एक सरल 'बारे में' मोडल डायलॉग बनाना चाहता हूं, जिसे सहायता-> एप्लिकेशन मेनू के बारे में कहा जाता है। मैंने QT निर्माता (.ui फ़ाइल) के साथ एक मोडल संवाद विंडो बनाई है।मेनू आइटम पर क्यूटी शो मोडल डायलॉग (.ui) पर क्लिक करें

मेनू 'स्लॉट' में कौन सा कोड होना चाहिए?

अब मैं (मेरे about.ui पर आधारित नहीं) इस कोड है, लेकिन यह एक नया मॉडल संवाद दिखाता है:

void MainWindow::on_actionAbout_triggered() 
{ 
    about = new QDialog(0,0); 
    about->show(); 
} 

धन्यवाद!

उत्तर

26

आपको अपने .ui फ़ाइल से यूआई के साथ संवाद स्थापित करने की आवश्यकता है। क्यूटी uic कंपाइलर आपके .ui फ़ाइल से एक हेडर फ़ाइल जेनरेट करता है जिसे आपको अपने कोड में शामिल करने की आवश्यकता है। मान लीजिए कि आपकी .ui फ़ाइल को about.ui कहा जाता है, और संवाद को About नाम दिया गया है, तो uic फ़ाइल ui_about.h फ़ाइल बनाता है, जिसमें Ui_About कक्षा होती है। सेटअप अपने यूआई के विभिन्न दृष्टिकोणों सरलतम में आप कर सकते हैं

#include "ui_about.h" 

... 

void MainWindow::on_actionAbout_triggered() 
{ 
    about = new QDialog(0,0); 

    Ui_About aboutUi; 
    aboutUi.setupUi(about); 

    about->show(); 
} 

एक बेहतर दृष्टिकोण,, विरासत का उपयोग करने के लिए इतना है कि आप किसी भी कार्यक्षमता के भीतर विशेष संवाद करने के लिए विशिष्ट लागू कर सकते हैं, क्योंकि यह आपके संवाद बेहतर समाहित है कर रहे हैं, उप वर्ग:

AboutDialog.h:

#include <QDialog> 
#include "ui_about.h" 

class AboutDialog : public QDialog, public Ui::About { 
    Q_OBJECT 

public: 
    AboutDialog(QWidget * parent = 0); 
}; 

AboutDialog.cpp:

+०१२३५१६४१०६१
AboutDialog::AboutDialog(QWidget * parent) : QDialog(parent) { 

    setupUi(this); 

    // perform additional setup here ... 
} 

उपयोग:

#include "AboutDialog.h" 

... 

void MainWindow::on_actionAbout_triggered() { 
    about = new AboutDialog(this); 
    about->show(); 
} 

किसी भी मामले में, महत्वपूर्ण कोड setupUi() विधि कॉल करने के लिए है।

बीटीडब्ल्यू: उपरोक्त कोड में आपका संवाद गैर-मोडल है। एक मोडल संवाद दिखाने के लिए, windowModalityQt::ApplicationModal पर अपने संवाद का ध्वज सेट करें या show() के बजाय exec() का उपयोग करें।

+0

धन्यवाद, एंड्रियास! इस पल के लिए सबसे आसान तरीका जा रहा है ... तथ्य यह है कि ui_about.h नहीं बनाया गया था, और यह अब पूर्व निर्धारित नहीं है। तो आपके द्वारा पहले निर्दिष्ट कोड के साथ प्रोजेक्ट संकलित नहीं करता है। क्या ui_about.h मैन्युअल रूप से बनाने का कोई तरीका है? .. –

+1

आप मैन्युअल रूप से इसे 'uic about.ui -o ui_about.h' के साथ बना सकते हैं। लेकिन आपके निर्माण प्रणाली को इसका ख्याल रखना चाहिए - सुनिश्चित करें कि 'FORMS = about.ui' आपकी' .pro' फ़ाइल में शामिल है। –

+0

क्या आपके पास .pro फ़ाइल में कोई अजीब प्रविष्टियां हैं? कुछ समय पहले संसाधन फ़ाइलों को नहीं बनाया जा रहा था: http://stackoverflow.com/questions/12380171/qmake-not-generating-binary-resource-files/12431570#12431570 –

4

मोडल संवाद के लिए, आपको exec() QDialogs विधि का उपयोग करना चाहिए।

about = new QDialog(0, 0); 

// The method does not return until user closes it. 
about->exec(); 

// In this point, the dialog is closed. 

Docs कहते हैं:

सबसे आम तरीका प्रदर्शित करने के लिए एक मॉडल संवाद अपने exec() समारोह कॉल करने के लिए है। जब उपयोगकर्ता संवाद बंद कर देता है, exec() एक उपयोगी वापसी मूल्य प्रदान करेगा।


वैकल्पिक तरीका: आप मॉडल संवाद की जरूरत नहीं है । संवाद मॉडल मॉडल दिखाएं और उपयुक्त स्लॉट पर accepted() और rejected() संकेतों को कनेक्ट करें।फिर आप अपने सभी कोड को के बाद सही रखने के बजाय स्लॉट स्वीकार कर सकते हैं। तो, इस तरह से, आपको वास्तव में एक मोडल संवाद की आवश्यकता नहीं होगी।

संबंधित मुद्दे