2012-09-30 12 views
18

यह संभवतः मेरे पास सबसे कमजोर समस्या है, लेकिन मैं बेहद उलझन में हूं। मैं लेआउट के साथ शुरू करने की कोशिश कर रहा हूं, लेकिन किसी कारण से इसे एक नहीं समझ सकता है।कोड से यूआई में बनाए गए क्यूटी लेआउट तक पहुंच?

मैंने .ui फ़ाइल के माध्यम से एक QGridLayout जोड़ने की कोशिश की है, बस इसे मेरे प्रोजेक्ट में छोड़कर खींचें। चूंकि मैं लोडिंग पर विगेट्स के साथ ग्रिड को पॉप्युलेट करना चाहता हूं, इसलिए मैंने "mainwindow.h" फ़ाइल में "gridLayout" ऑब्जेक्ट का उपयोग करने की कोशिश की है- इस से पहले /> setupui() को कॉल किया जाता है।

जैसा कि मैं इसे समझ नहीं पाया, मैंने इसे कोड का उपयोग करके स्क्रैच से बनाने का प्रयास करने का विकल्प चुना, और इसके बजाय main.cpp फ़ाइल में निम्नलिखित जोड़ा। यह या तो प्रदर्शित नहीं हुआ, इसलिए मैं सोच रहा हूं कि जब पृथ्वी लोड हो जाती है तो मैं पृथ्वी पर कैसे ग्रिड को पॉप्युलेट कर सकता हूं।

#include <QtGui/QApplication> 
#include <QtGui> 
#include "mainwindow.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow w; 

    QGridLayout *grid = new QGridLayout; 

    QLabel *label1 = new QLabel("test"); 
    QLabel *label2 = new QLabel("test 2"); 

    grid->addWidget(label1, 0, 0); 
    grid->addWidget(label2, 0, 1); 
    w.setLayout(grid); 

    w.show(); 
    return app.exec(); 
} 
+0

वास्तव में क्या समस्या है, विगेट्स आप दिखाई नहीं दे जोड़ रहे हैं, या गलत जगह में दिख रहे हो? – cmannett85

+0

वे तब तक बिल्कुल दिखाई नहीं दे रहे हैं जब तक कि मैं उन्हें यूआई संपादक के माध्यम से जोड़ूं, इस मामले में मैं इसे पॉप्युलेट करने के लिए कोड के माध्यम से लेआउट तक नहीं पहुंच पा रहा हूं। –

उत्तर

23

मान लें, तो आप बस QtDesigner में एक QGridLayout अपने centralWidget को MainWindow में इस तरह की स्थापना की है:

enter image description here

आप सही उद्देश्य के साथ कि रास्ते में अपने MainWindow कोड में उस तक पहुँच सकते नाम (gridLayout यहाँ यह है):

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ui->gridLayout->addWidget(new QLabel("hello world"),0,0); 
} 

आप QtDesigner में या कोड में एक लेआउट सेट है और आप लेआउट बदलना चाहते हैं, QWidget आप एक दूसरे को स्थापित करने और आप मिल जाएगा नहीं दूँगी इस तरह एक त्रुटि संदेश:

QWidget :: setLayout: QLayout सेट करने के लिए "" MainWindow पर "MainWindow" है, जो पहले से ही एक लेआउट है प्रयास कर रहा है

इस मामले में आपको पहले मौजूदा लेआउट को हटाना होगा और फिर ऊपर दिए गए कोड में नया इंस्टॉल करना होगा।

आप अपने मुख्य समारोह में लेआउट का उपयोग करना चाहते हैं तो आप इस तरह QObject :: findChild समारोह से इस लक्ष्य को हासिल कर सकते हैं:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 

    QGridLayout *gridLayout = w.findChild<QGridLayout*>("gridLayout"); 
    Q_ASSERT(gridLayout); 
    gridLayout->addWidget(new QLabel("hello, the second")); 

    w.show(); 
    return a.exec(); 
} 
+0

आपके द्वारा दिया गया पहला उदाहरण मैंने पहले कोशिश की थी, हालांकि मुझे पूरा यकीन नहीं है कि मैंने इसे कैसे खराब कर दिया। मेरा मानना ​​है कि मैं इसे "ui" के सदस्य होने के विरोध में "ग्रिडलाउट" के रूप में एक्सेस करने का प्रयास कर रहा था। महान प्रतिक्रिया के लिए बहुत बहुत धन्यवाद और इसे साफ़ करना! –

+0

यह मेरे लिए काम नहीं करता (पहला समाधान।) प्रोग्राम संकलित करता है लेकिन कोई विजेट नहीं दिखाया जाता है। कोई डीबगिंग विचार? – baordog

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