Qt Send Signal для генерации QDialog из динамического компонента

В попытке создать небольшой графический интерфейс поиска я хотел, чтобы всякий раз, когда пользователь вводит в TextEdit, программа ищет все правдоподобные результаты и показывает их в QGroupBox внутри QScollArea.

Теперь я хочу добавить, что, когда я нажимаю на QGroupBox, открывается новый QDialog и показывает детали найденного результата. (Это удаляет себя при закрытии - окно мелких деталей, а не QGroupBox)

Мне удалось сделать все, кроме того, что когда я нажимаю на QGroupBox, открывается новый QDialog.

Вот мой код:
organizer.h

class Organizer : public QMainWindow
{
  Q_OBJECT

private:
    QGroupBox* generateSearchResultEnclosure(const std::string& item_name,const std::string& classer_name, const unsigned row, const unsigned column);
    std::vector<QGroupBox*> search_results;
    QGridLayout *scroll_layout;
    unsigned nRows;
public:
    explicit Organizer(ItemOrganizer* item_org,QWidget *parent = 0);
   ~Organizer();

private slots:
    void generateClickedWindowItemResult(const std::string& exact_item_name, QWidget* parent);
    void on_searchField_textChanged();
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void updateFormComponentAddAvailable();
    void updateFormAdd2ClsrAvailable();
    void updateFormInsrtClsrAvailable();
    void on_addClasser_PushButton_clicked();

private:
    Ui::Organizer *ui;
    ComponentAdd *form_cmp_add;
    AddToClasser *form_add2_clsr;
    InsertClasser *form_insrt_clsr;
    ItemOrganizer *item_organizer;

};

organizer.cpp
(При изменении текста QTextEdit):

void Organizer::on_searchField_textChanged()
{
   QWidget *wdg=ui->scrollArea->takeWidget();
   delete wdg;
   QWidget* blank_wdg=new QWidget();
   scroll_layout=new QGridLayout(blank_wdg);
   //widget->setLayout(layout);
   ui->scrollArea->setWidget(blank_wdg);
   ui->scrollArea->setWidgetResizable(true);

   if ((ui->searchField->toPlainText()).isEmpty())
      return;

   // Searching and generating a QGroupBox for each hit
   std::vector<SearchResult> res=item_organizer->search((ui->searchField->toPlainText()).toUtf8().constData());

   for (SearchResult &sr:res)
   {
       QGroupBox *win=generateSearchResultEnclosure(sr.cmp->name,sr.classer_name,sr.row,sr.column);
       scroll_layout->addWidget(win);
       win->show();
   }

   // Corecting QScrollArea widget size to fit all QGroupBox results
   unsigned row_count=0;
   if (scroll_layout->count()!=0)
       row_count=scroll_layout->rowCount();

   if(row_count>= nRows)
   {
         int h = 1.0*(ui->scrollArea->width() - scroll_layout->verticalSpacing()*(nRows+1.6))/nRows;
         int hCorrected = h*row_count + scroll_layout->verticalSpacing()*(row_count+2);
         ui->scrollArea->widget()->setFixedHeight(hCorrected);
   }
   ui->scrollArea->widget()->setFixedWidth(ui->scrollArea->viewport()->width());
}

organizer.cpp (функция, которая генерирует QGroupBox):

QGroupBox* Organizer::generateSearchResultEnclosure(const std::string& item_name,const std::string& classer_name, const unsigned row, const unsigned column)
{
QGroupBox* holder=new QGroupBox();
QVBoxLayout *layout_main=new QVBoxLayout;

QGroupBox *item_grp=new QGroupBox();
QGroupBox *clsr_grp=new QGroupBox();
QGroupBox *row_grp=new QGroupBox();
QGroupBox *column_grp=new QGroupBox();

QHBoxLayout *layout_item=new QHBoxLayout;
QHBoxLayout *layout_classer=new QHBoxLayout;
QHBoxLayout *layout_row=new QHBoxLayout;
QHBoxLayout *layout_column=new QHBoxLayout;

QLabel *item_label=new QLabel(tr("Item Name: "));
QLabel *clsr_label=new QLabel(tr("Classer Name: "));
QLabel *row_label=new QLabel(tr("Row: "));
QLabel *column_label=new QLabel(tr("Column: "));

QLineEdit *item_edit=new QLineEdit();
QLineEdit *classer_edit=new QLineEdit();
QLineEdit *row_edit=new QLineEdit();
QLineEdit *column_edit=new QLineEdit();

item_edit->setReadOnly(true);
classer_edit->setReadOnly(true);
row_edit->setReadOnly(true);
column_edit->setReadOnly(true);

item_edit->setText(item_name.c_str());
classer_edit->setText(classer_name.c_str());
row_edit->setText(QString::number(row));
column_edit->setText(QString::number(column));

layout_item->addWidget(item_label);
layout_item->addWidget(item_edit);

layout_classer->addWidget(clsr_label);
layout_classer->addWidget(classer_edit);

layout_row->addWidget(row_label);
layout_row->addWidget(row_edit);

layout_column->addWidget(column_label);
layout_column->addWidget(column_edit);

item_grp->setLayout(layout_item);
clsr_grp->setLayout(layout_classer);
row_grp->setLayout(layout_row);
column_grp->setLayout(layout_column);
layout_main->addWidget(item_grp);
layout_main->addWidget(clsr_grp);
layout_main->addWidget(row_grp);
layout_main->addWidget(column_grp);
layout_main->addStretch();
holder->setLayout(layout_main);
//holder->setMaximumHeight(ui->scrollArea->height()/2 - 10);
holder->setStyleSheet("QGroupBox {border: 2px solid gray; border-radius: 1px;} "
                      "QGroupBox::title {background-color: transparent; subcontrol-position: top left; padding:2 13px;}");

connect(holder, SIGNAL(clicked(bool)),this,SLOT(generateClickedWindowItemResult(item_name,holder)));
return holder;
}

Теперь я решил, что не могу подключить этот слот к этому сигналу (поскольку SIGNAL и SLOT должны иметь одинаковые аргументы), даже если что-то подобное будет работать для меня.

Вот часть, где я генерирую этот QDialog в случае, если это необходимо как часть решения проблемы. (Хотя это только заполнение формы)

void Organizer::generateClickedWindowItemResult(const std::string& exact_item_name, QWidget *parent)
{
Component* cmp=item_organizer->getComponentByFullName(exact_item_name,true);
QDialog* cmp_window=new QDialog(parent);

QVBoxLayout *layout_main=new QVBoxLayout;

QGroupBox *item_name_grp=new QGroupBox();
QGroupBox *descr_grp=new QGroupBox();
QGroupBox *url_grp=new QGroupBox();
QGroupBox *tags_grp=new QGroupBox();
QGroupBox *quantity_grp=new QGroupBox();
QGroupBox *future_quantity_grp=new QGroupBox();

QHBoxLayout *layout_item_name=new QHBoxLayout;
QHBoxLayout *layout_descr=new QHBoxLayout;
QHBoxLayout *layout_url=new QHBoxLayout;
QHBoxLayout *layout_tags=new QHBoxLayout;
QHBoxLayout *layout_quantity=new QHBoxLayout;
QHBoxLayout *layout_future_quantity=new QHBoxLayout;

QLabel *item_name_label=new QLabel(tr("Item Name: "));
QLabel *descr_label=new QLabel(tr("Item Description: "));
QLabel *url_label=new QLabel(tr("Datasheet URL: "));
QLabel *tags_label=new QLabel(tr("Item Tags: "));
QLabel *quantity_label=new QLabel(tr("Item Current Quantity: "));
QLabel *future_quantity_label=new QLabel(tr("Item current+ordered quantity: "));

QLineEdit *item_name_edit=new QLineEdit();
QTextEdit *descr_edit=new QTextEdit();
QTextEdit *url_edit=new QTextEdit();
QTextEdit *tags_edit=new QTextEdit();
QLineEdit *quantity_edit=new QLineEdit();
QLineEdit *future_quantity_edit=new QLineEdit();

item_name_edit->setReadOnly(true);
descr_edit->setReadOnly(true);
url_edit->setReadOnly(true);
tags_edit->setReadOnly(true);
quantity_edit->setReadOnly(true);
future_quantity_edit->setReadOnly(true);

item_name_edit->setText(cmp->name.c_str());
descr_edit->setText(cmp->description.c_str());
url_edit->setText(cmp->url.c_str());

// TODO WRITE TAGS
//tags_edit->setText(cmp->tags);
quantity_edit->setText(QString::number(cmp->quantity));
future_quantity_edit->setText(QString::number(cmp->future_quantity));

layout_item_name->addWidget(item_name_label);
layout_item_name->addWidget(item_name_edit);

layout_descr->addWidget(descr_label);
layout_descr->addWidget(descr_edit);

layout_url->addWidget(url_label);
layout_url->addWidget(url_edit);

layout_tags->addWidget(tags_label);
layout_tags->addWidget(tags_edit);

layout_quantity->addWidget(quantity_label);
layout_quantity->addWidget(quantity_edit);

layout_future_quantity->addWidget(future_quantity_label);
layout_future_quantity->addWidget(future_quantity_edit);

item_name_grp->setLayout(layout_item_name);
descr_grp->setLayout(layout_descr);
url_grp->setLayout(layout_url);
tags_grp->setLayout(layout_tags);
quantity_grp->setLayout(layout_quantity);
future_quantity_grp->setLayout(layout_future_quantity);


layout_main->addWidget(item_name_grp);
layout_main->addWidget(descr_grp);
layout_main->addWidget(url_grp);
layout_main->addWidget(tags_grp);
layout_main->addWidget(quantity_grp);
layout_main->addWidget(future_quantity_grp);

layout_main->addStretch();
cmp_window->setLayout(layout_main);
cmp_window->setAttribute(Qt::WA_DeleteOnClose);
cmp_window->show();
}

Как я могу подключить сигнал по нажатию от моего QGroupBox, чтобы сгенерировать QDialog и передать параметр в QDialog, а также поместить QGroupBox в качестве его родителя?

0 ответов

Другие вопросы по тегам