QComobox [dynamiczne dodawanie item-ow]

0

Hej,

Jestem begginers z qt. Chcialabym dodawac do listy dynamicznie nowe itemy.
Tzw. po kliknieciu button-a, aby w combobox pojawil sie nowy item (np. najlepiej na poczek z indexem 0/1, nowe itemy na poczatek listy).
Napisalam juz ponizszy kod ale cos jest zle ;/, nie wiem gdzie robiee blad.
Tutaj zamieszczam moj kod :

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui/QComboBox>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void addNewItem(int index);


private:
    Ui::MainWindow *ui;
    QComboBox *combo;
    QList<QStringList> attributeList;
    QList<QString> aList;
    QSize comboSize;
    int separatorPoz;
    int index;
};

#endif // MAINWINDOW_H

 
 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QtGui"
#include "QList"
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    QList<QStringList> attributeList;
    QList<QString> aList;

    QWidget *win = new QWidget;
    QVBoxLayout *layout = new QVBoxLayout;
    QComboBox* combo = new QComboBox();
    QPushButton *button = new QPushButton("Add item to combobox");
    combo->setFocusPolicy(Qt::NoFocus);
    aList.append("Solid");
    aList.append("Select File");
    attributeList.append(aList);
    combo->addItem("Solid");
    combo->addItem("Select file");
    comboSize = combo->size();
    combo->insertSeparator(aList.size()-1);
    combo->setCurrentIndex(0);

    QObject::connect(button,SIGNAL(clicked()),combo, SLOT(addNewItem(int)));
    
    layout->addWidget(combo);
    layout->addWidget(button);
    win->setLayout(layout);
    win->showMaximized();

}

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

void MainWindow::addNewItem(int index)
{

    index = aList.size()+1;
    aList.append("File %1" + QString::number(aList.size()));
    attributeList.append(aList);
    QString newItem = "File %1" + QString::number(aList.size());
    combo->addItem(newItem);
    combo->update();

}

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>

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

    return a.exec();
}

 

Bede wdzieczna za kazda pomoc :)

1

Dodawanie na początek listy możesz wykonać przy pomocy "insertItem(...)":

class Form : public QMainWindow {
    Q_OBJECT

    public:
        Form(QWidget *parent = 0) : QMainWindow(parent), i(0)
        {
            connect(&button, SIGNAL(clicked()), this, SLOT(_slAdd()));
            layout.addWidget(&button);
            layout.addWidget(&combo);

            QWidget *w = new QWidget();
            w->setLayout(&layout);
            setCentralWidget(w);

            button.setText("Dodaj");
        }

        ~Form(){}

    private:
        QPushButton button;
        QComboBox combo;
        QHBoxLayout layout;
        quint16 i;

    private slots:
        void _slAdd()
        {
            combo.insertItem(0, "item " + QString::number(++i));
           //combo.setCurrentIndex(0); - aby ustawić wybrany element combo na ten co dodałaś
        }

};
1

Tą linijkę kodu:

QObject::connect(button,SIGNAL(clicked()),combo, SLOT(addNewItem(int)));

przerób na taką:

if(!QObject::connect(button,SIGNAL(clicked()),combo, SLOT(addNewItem(int)))) QMessageBox::critical(this,0,"Signal not connected!");

i obacz cóż to się wydarzy :]

0

noo sygnaly nie sa polaczone ;/ Thanks ;)

Zmienilam teraz na insertItem().. i juz connection jest ok ...
ale teraz jak klikne na button, to program wywala sie ;/

Cos w tym slocie jeszcze nie gra ?

 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui/QComboBox>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void addNewItem();


private:
    Ui::MainWindow *ui;
    QComboBox *combo;
    QList<QStringList> attributeList;
    QList<QString> aList;
    QSize comboSize;
    int separatorPoz;
    int index;

    quint16 i;
};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QtGui"
#include "QList"
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow),i(0)
{
    ui->setupUi(this);
    QWidget *win = new QWidget;
    QVBoxLayout *layout = new QVBoxLayout;
    QComboBox* combo = new QComboBox();
    QPushButton *button = new QPushButton("Add item to combobox");
   // combo->setFocusPolicy(Qt::NoFocus);
    aList.append("Solid");
    aList.append("Select File");
    attributeList.append(aList);
    combo->addItem("Solid");
    combo->addItem("Select file");
    comboSize = combo->size();
    combo->insertSeparator(aList.size()-1);
    combo->setCurrentIndex(0);


    if(!QObject::connect(button,SIGNAL(clicked()),this, SLOT(addNewItem()))) QMessageBox::critical(this,0,"Signal not connected!");

    layout->addWidget(combo);
    layout->addWidget(button);
    win->setLayout(layout);
    win->showMaximized();

}

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

//Cos w tym slocie jeszcze nie gra ? 
void MainWindow::addNewItem()
{

    aList.append("File %1" + QString::number(aList.size()));
    attributeList.append(aList);
    QString newItem = "File %1" + QString::number(aList.size());

    combo->insertItem(0, newItem);
    combo->setCurrentIndex(0);


}

1

To jakieś zadanie domowe? Ponieważ chyba masz małe pojęcie o podstawach, czyli o samym języku C++ ;P
W slocie addNewItem używasz niezainicjalizowanej zmiennej prywatnej klasy MainWindow: czyli combo, przez co program się wywala.

0

Nastaw sobie breakpointa na 1 linijce kodu w funkcji addNewItem() po czym uruchom program pod debuggerem - dzięki temu dowiesz się,która linijka powoduje wywrotkę programu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1