QComobox [dynamiczne dodawanie item-ow]

QComobox [dynamiczne dodawanie item-ow]
wiatrak11
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 9 lat
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 :

Kopiuj
#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

 
Kopiuj
 

#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();

}

Kopiuj
#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 :)

matek3005
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 5 lat
  • Postów:358
1

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

Kopiuj
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ś
        }

};
edytowany 3x, ostatnio: matek3005
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:5 dni
  • Lokalizacja:Warszawa
  • Postów:1454
1

Tą linijkę kodu:

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

przerób na taką:

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

i obacz cóż to się wydarzy :]


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 5x, ostatnio: MasterBLB
wiatrak11
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 9 lat
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 ?

Kopiuj
 
#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

Kopiuj
#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);


}

BI
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:5
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.

MasterBLB
Ehh Bracie binary,weź ty się przyjrzyj dobrze konstruktorowi...
BI
Przyjrzałem się, no i? Może czegoś niedowidzę, bo wydaje mi się, że napisałem poprawnie co jest nie tak. Proszę o wyjaśnienie.
BI
Oczywiście nie napisałem o pewnym przesłonięciu zmiennej, aby nie podawać całej ryby na tacy Bracie MasterBLB, więc może objaśnisz co miałeś na myśli?
MasterBLB
Właśnie brak przesłonięcia mi się uwidział.Zwracam honor jako że to ja się pomyliłem,i idąc spać solennie sobie obiecuję nigdy nie patrzeć w kod będąc niewyspanym.
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:5 dni
  • Lokalizacja:Warszawa
  • Postów:1454
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.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.