Tworzenie obiektów w kodzie - kod nie działa.

0

Witam napisałem taki trochę pogmatwany kod, nie wiem co zrobiłem źle i jak to wgl ma działać może ktoś mnie olśni? Chcę tworzyć folder no taki zwykły pushbutton z ikonką tam potem do niego dodam inne rzeczy ale ogólnie chce go tworzyć przez przycisk i jak go zrobie to on wskakuje do layoutu z labelem (jego nazwą) i potem tak kolejny i kolejny...
tylko że wywala program po kliknięciu btnadd

void Protocols::on_btnadd_clicked()
{

    Folder *fold = new Folder;
    lay->addLayout(fold->getFolder(),0,0);
}
Protocols::Protocols(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Protocols)
{
    ui->setupUi(this);
   
//.................
    ui->scrollArea->setWidget(ui->scrollgrid);
    lay = new QGridLayout;
    ui->scrollgrid->setLayout(lay);

#include "folder.h"

Folder::Folder(QObject *parent, QString name)
{
    folderbtn = new QPushButton;
    folderbtn->setIcon(QIcon(":/images/images/folder.jpg"));
    folderbtn->setMaximumSize(120,120);
    folderbtn->setMinimumSize(120,120);


    folderlbl->setAlignment(Qt::Alignment(Qt::AlignHCenter));
    folderlbl->setText(name);

    layout = new QVBoxLayout;
    layout->addWidget(folderbtn);
    layout->addWidget(folderlbl);
    setLayout(layout);

}

QLayout* Folder::getFolder()
{
    return layout;
}

#include <QtCore>
#include <QWidget>
#ifndef FOLDER_H
#define FOLDER_H

#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>


class Folder : public QWidget
{

public:
    explicit Folder(QObject *parent = nullptr, QString name= "");
    QLayout *getFolder();
signals:

public slots:

protected:
    QPushButton *folderbtn;
    QLabel *folderlbl;
    QVBoxLayout *layout;
};

#endif // FOLDER_H

1

Debugger Twoim przyjacielem ;)

PS W klasie Folder brakuje makra Q_OBJECT.

0
tajny_agent napisał(a):

Debugger Twoim przyjacielem ;)

PS W klasie Folder brakuje makra Q_OBJECT.

Mam pytanie czy jak przerzucam layout który w którym coś jest to idzie on z zawartością czy sam?

/EDIT:
Dobra, już się udało - za wcześno ustawiałem layout (w konstruktorze zamiast po dodaniu)

0

:D wyszedł nowy problem, skoro każdy ten btn jest new to jak ja dopiszę sloty do nich? każdy folder w domyśle ma wyświetlać ... no jak folder pliki w nim różne po kliknięciu w niego inny custom Dialog po prostu

2

Możesz najzwyczajniej użyć jakiegoś kontenera.

class MyWidget : public QWidget
{
  Q_OBJECT

public:
  explicit MyWidget(QWidget* parent = nullptr);

protected slots:
  void onButtonClicked(bool checked = false);

private:
  std::unordered_map<QPushButton*, int> buttons;
};
MyWidget::MyWidget(QWidget* parent) : QWidget(parent)
{
  auto layout = new QVBoxLayout;
  for (int i = 0; i < 10; ++i)
  {
    auto btn = new QPushButton(QString("Przycisk %1").arg(i), this);
    connect(btn, &QPushButton::clicked, this, &MyWidget::onButtonClicked);
    buttons.insert(make_pair(btn, i));
    layout->addWidget(btn);
  }
  setLayout(layout);
}

void MyWidget::onButtonClicked(bool checked)
{
  Q_UNUSED(checked);
  if (auto btn = qobject_cast<QPushButton*>(QObject::sender()); btn) {
    if (auto iter = buttons.find(btn); iter != buttons.cend()) {
      int value = iter->second;
      // i tu używasz jakichś danych przypisanych do konkretnego przycisku
    }
  }
}
0

&MyWidget::onButtonClicked chciałem się dopytać co dokładnie taki zapis oznacza - bez nawiasów funkcjowych i jeszcze podane że z tej klasy skoro i tak w tej klasie piszemy?

0
void Protocols::on_btnadd_clicked()
{
    justcounter++;
    Folder *fold = new Folder(nullptr,"kotek");
    lay->addLayout(fold->getFolder(),rowcounter,columncounter);
    ui->scrollArea->setWidget(ui->scrollgrid);
    ui->scrollgrid->setLayout(lay);
    columncounter++;
    if(columncounter==4)
    {
        columncounter=0;
        rowcounter++;
    }

        connect(&fold->getBtn(), &QPushButton::clicked, this, &Protocols::onBtnFolderClicked);
        buttons.insert((make_pair(fold->getBtn(), justcounter)); // use of unincluded identifier 
//(co mam dodać? jest iostream i unordered map, próbowałem dodać jako ```std::make_pair()``` ale nie działa też


        //layout->addWidget(btn);


}

Gdzie justcounter to int a getBtn to

const QPushButton &Folder::getBtn()
{
    return *folderbtn;
}
1

Co do składni connect -> New Signal Slot Syntax

Zamiast make_pair możesz napisać buttons.insert({fold->getBtn(),justcounter});
Tylko spójrz, że Folder::getBtn() zwraca stałą referencję(IMHO bez sensu) a w mapie kluczem jest pewnie wskaźnik.

Ja bym się jednak poważnie zastanowił czy nie lepiej użyć w tym przypadku QTableView.

1
tajny_agent napisał(a):

Co do składni connect -> New Signal Slot Syntax

Zamiast make_pair możesz napisać buttons.insert({fold->getBtn(),justcounter});
Tylko spójrz, że Folder::getBtn() zwraca stałą referencję(IMHO bez sensu) a w mapie kluczem jest pewnie wskaźnik.

Ja bym się jednak poważnie zastanowił czy nie lepiej użyć w tym przypadku QTableView.

Hmmm no tak trochę nie bardzo bo mam koncept taki że (załącznik)

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