2015-04-03 4 views
-1

В одном классе есть поле со списком, в котором пользователю нужно выбрать номер из него. Затем значение присваивается переменной, и поскольку элементы со списком являются текстами, переменная, содержащая номер (другими словами, текст), выбранный пользователем преобразуется в целочисленное значение с использованием 'toInt()' и присваивается целочисленной переменной в тот же класс. Теперь другой класс должен иметь доступ к целочисленной переменной другого класса (т. Е. Номер, выбранный пользователем), так что в зависимости от его значения пользователю отображается такое же количество виджетов. Когда я выбираю номер из поля со списком и нажимаю кнопку, ничего не происходит. Я ожидаю, что тот же номер я выбрал из поля со списком для dsiplay в качестве редактирования строки.Как получить значение переменной члена одного класса другому

Код;

combobox.h

#ifndef COMBOBOX_H 
#define COMBOBOX_H 

#include <QDialog> 
#include <QComboBox> 
#include <QPushButton> 
#include <QStringList> 
#include <QVBoxLayout> 

class ComboBox : public QDialog { 
public: 
    ComboBox(); 
    ~ComboBox(); 

private slots: 
    void on_go_button_clicked(); 

private: 
    QComboBox *comboBox; 

public: 
    QPushButton *go; 
    int textToInt; 
}; 

#endif // COMBOBOX_H 

lineeditwidgets.h

#ifndef LINEEDITWIDGETS_H 
#define LINEEDITWIDGETS_H 

#include <QDialog> 
#include <QLineEdit> 
#include <QVBoxLayout> 
#include "combobox.h" 

class LineEditWidgets : public QDialog { 
public: 
    LineEditWidgets(); 
    LineEditWidgets(ComboBox*);  //edited 
    ~LineEditWidgets(); 

private: 
    QLineEdit *lineEdit; 

    //object created so member of class 'ComboBox' can be accessed 
    ComboBox *take; 
}; 

#endif // LINEEDITWIDGETS_H 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QStackedWidget> 

#include "lineeditwidgets.h" 
#include "combobox.h" 

class MainWindow : public QMainWindow { 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private slots: 
    void go_button_clicked(); 

private: 
    QStackedWidget *pages; 

    ComboBox *comboBoxWindow; 
    LineEditWidgets *lineEditWindow; 

}; 

#endif // MAINWINDOW_H 

combobox.cpp

#include <QtGui> 
#include "combobox.h" 

ComboBox::ComboBox() { 
    comboBox = new QComboBox; 
    QStringList items; 
    items << "1" << "2" << "3" << "4" << "5"; 
    comboBox->addItems(items); 

    go = new QPushButton("Go"); 

    QVBoxLayout *layout = new QVBoxLayout; 
    layout->addWidget(comboBox); 
    layout->addWidget(go); 

    setLayout(layout); 

    /*i get 'No such slot QDialog::on_go_button_clicked()' even though this 
     function was declared as a slot in the header file*/ 
    connect(go, SIGNAL(clicked()), this, SLOT(on_go_button_clicked())); 
} 

/*the number selected from combobox is converted to integer here. I can't 
    seem to understand how 'toInt()' works, i thought it was like 
    'stringstream()' */ 
void ComboBox::on_go_button_clicked() { 
    QString text; 
    comboBox->currentTextChanged(text); 
    QString getCurrentText = comboBox->currentText(); 
    textToInt = getCurrentText.toInt(); 
} 

ComboBox::~ComboBox() { 

} 

lineeditwidgets.cpp

#include <QtGui> 
#include "lineeditwidgets.h" 

LineEditWidgets::LineEditWidgets(ComboBox* comboBoxWin) { //edited 
    /*member of 'ComboBox' class is accessed here and assigned to int 
     variable. I thought it's supposed to be holding the number the user 
     selected by now*/   
    /*take = new ComboBox;*/   //edited 
     take = comboBoxWin;    //edited 

    int numb = take->textToInt; 

    QVBoxLayout *layout = new QVBoxLayout; 

    for (int i = 0; i < numb; i++) { 
     lineEdit = new QLineEdit; 
     layout->addWidget(lineEdit); 
    } 

    setLayout(layout); 
} 

LineEditWidgets::~LineEditWidgets(){ 

} 

mainwindow.cpp

#include "mainwindow.h" 
#include <ui_mainwindow.h> 

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ 
    comboBoxWindow = new ComboBox; 
    /*lineEditWindow = new LineEditWidgets;*/  //edited 
    lineEditWindow = new LineEditWidgets(comboBoxWindow); //edited 

    pages = new QStackedWidget; 
    pages->insertWidget(1, comboBoxWindow); 
    pages->insertWidget(2, lineEditWindow); 
    pages->setCurrentWidget(comboBoxWindow); 

    setCentralWidget(pages); 

    connect(comboBoxWindow->go, SIGNAL(clicked()), this, 
    SLOT(go_button_clicked())); 
} 

void MainWindow::go_button_clicked() { 
    pages->setCurrentWidget(lineEditWindow); 
} 

MainWindow::~MainWindow() { 

} 

main.cpp

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

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

    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 
+3

«Не могу заставить его работать» не является допустимым вопросом или описанием. В чем проблема? Код не компилируется? Показать сообщение об ошибке. Вы получаете неправильные результаты? Объясните, какие результаты вы получаете, какие результаты вы ожидаете получить, и в чем разница. –

+0

@SamVarshavchik ничего не отображается. Я обновил свой вопрос. –

+0

Ниже 3 способа можно использовать в зависимости от спецификатора доступа. 1. Если его можно сохранить 'public', вы можете сохранить введенную пользователем переменную в глобальной переменной и использовать' extern' в других файлах для доступа к ней. Вы также можете использовать концепцию наследования для достижения этой цели. 2. Если он «защищен», вы можете получить к нему доступ через производный класс, а затем поделиться им с внешним миром, используя некоторые глобальные переменные, как упомянуто выше. 3. Если это «частные» данные, то одно и то же может быть передано другим классам, используя функции друга, и оттуда его можно присвоить глобальной переменной. –

ответ

0

Я думаю, что проблема в том, что существуют два отдельных экземпляра ComboBox. Один создан в MainWindow - comboBoxWindow = new ComboBox;, а другой создан в LineEditWidgets - take = new ComboBox;

Вы должны рассмотреть вопрос о принятии экземпляра ComboBox - comboBoxWindow к LineEditWidgets например lineEditWindow в конструкторе MainWindow и lineEditWindow необходимо сохранить переданный экземпляр ComboBox в указатель ComboBox - take.

+0

Смущенный! Если вы можете исправить часть моего кода, где я ошибся и прокомментировал его, поэтому я понимаю ваше исправление, я буду признателен за это. –

+0

Я отредактировал ваш код. – Vishal

+0

Да, я видел это, но я получаю предупреждение «Нет такого слота QDialog :: on_go_button_clicked()», когда я запускаю код, заставляя его вести себя так же, как и перед вашим редактированием. то есть не показывать редактирование строк после того, как я выбрал номер и нажал кнопку –

Смежные вопросы