Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Qt: Arvon lisäys listaan ei onnistu

Shaw [04.02.2015 01:21:18]

#

Moro

Yritän saada classB:n napin painalluksella tekstinkentän arvon mainwindow luokassa olevaan listaan. addToList-metodi suoritetaan ja qDebug- toimii, mutta item ei kuitenkaa lisäänny listaan. Mitään virheilmoitusta ei tule.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "classb.h"

#include <QDebug>
#include <QString>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    classB obj;
    obj.setModal(true);
    obj.exec();
}

void MainWindow::addToList(QString item)
{
    ui->list->addItem(item);
    qDebug() << item;
}
#include "classb.h"
#include "ui_classb.h"
#include "mainwindow.h"

#include <QString>

classB::classB(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::classB)
{
    ui->setupUi(this);
}

classB::~classB()
{
    delete ui;
}

void classB::on_pushButton_clicked()
{
    MainWindow ob;
    QString name = (ui->line->text());
    ob.addToList(name);
}

Teuro [04.02.2015 05:59:15]

#

Lisäys tehdään muuttujaan "ob" ei suinkaan siihen muuttujaan, johon luulet sen tekevän. Muuttuja "ob" classB::on_button_clicked-metodin paikallinen muuttuja, joka katoaa kun funktion suoritus loppuu.

Tuossa voisi lähettää signaalin mainwindow:e, jolloin voit poistaa riippuvuuden classB -luokalta.

The Alchemist [04.02.2015 11:10:09]

#

"classB" näyttää olevan dialogi-ikkuna, joten jos sen ainoa tehtävä on toimia syöttöikkunana eikä sillä ole omaa monimutkaista toiminnallisuutta, niin jättäisin koko classB-luokan pois. MainWindow-luokassa tekisin tavallisen QDialog-instanssin ja asentaisin classB:n layoutin siihen.

void MainWindow::on_pushButton_clicked() {
    QDialog d(this); // Parentti on parempi kuin setModal()
    Ui::classB dialogUi;
    dialogUi.setupUi(&d);

    // Suoritetaan vain, jos dialogi on "hyväksytty"
    if (d.exec()) {
        ui->list->addItem(dialogUi.line->text());
    }
}

Mikäli tarvitset kyseistä luokkaa monessa paikassa, niin sitten tee oma luokka, mutta lisää siihen getteri tyyliin thatOneText(), jota käyttäen voit MainWindow'n koodissa hakea syötetyn arvon. Tosin hieman vaikuttaa siltä, että voisit yhtä hyvin käyttää valmista QInputDialog-luokkaa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta