Przekazanie argumentu miedzy sygnałem a slotem w qt, tworzenie własnego sygnału.

1

Uczę się pisać w Qt, mam 12 elementową tablicę QPushButtonów i 12 elementową tablicę QLineEdit. Każdy Button o indeksie 'i' ma usunąć LineEdit o indeksie 'i'. Do tego chce mieć jeden uniwersalny slot. Z tego co wygooglałem to można przekazywać argument do slotu ale tylko poprzez sygnał, czyli nie wchodzi w grę takie coś:

connect(deleteButton[a], SIGNAL(clicked()), this, SLOT(deleteSlot(a)));

Więc rozumiem, że trzeba zrobić własny sygnał który przekaże argument 'a' do slotu, no i tu jest problem, ponieważ nie mam pojęcia jak się za to zabrać.
Jeśli jest inny sposób na taki uniwersalny slot to chętnie posłucham:)

1

Slot działa jak najzwyklejsza funkcja składowa,tylko ma jeden exta feature-można do niego connectować sygnały.
Co zaś do przekazywania indeksu,posłuż się następującą sztuczką:
1.Uzyj button->setObjectName() aby zapamiętać indeks buttona podczas jego tworzenia
2.Podłącz wszystkie swoje buttony do tego 1 slotu
3.W slocie użyj sender()->objectName().toInt() aby uzyskać indeks do tablicy z line editami

0

Dzięki, Twój sposób zadziałał świetnie:)
Ale skoro jest w temacie posta "tworzenie własnego sygnału", to może ktoś napisze coś na ten temat. Sloty mniej więcej wiem jak działają i jak tworzyć, ale o sygnałach nie wiem prawie nic. Jest jakaś skończona lista sygnałów typu clicked, triggered itp, czy można tworzyć własne sygnały? Albo modyfikować te podstawowe? Jeśli tak to jak?:)

1

Sygnały tworzysz tak jak zwykłe funkcje składowe,z następującymi ograniczeniami:
1.Deklarujesz je w sekcji signals: klasy
2.Podajesz tylko deklarację sygnału np void mySignal(param1,param2 itd);
3.Muszą one zwracać typ void
To wszystko masz bardzo dobrze opisane w Assistancie,szukaj signals and slots
A,i cyknij ptaszka pod numerkiem przy poście,który uznajesz za pomocny-twój temat będzie wówczas widoczny jako rozwiązany,co ułatwi życie innym użytkownikom 4p

1

Osobiście wolę do takiego celu stosować QSignalMapper

QSignalMapper *mapper = new QSignalMapper(this);
for(int i=0; i<n; ++i) {
    mapper->setMapping (deleteButton[i], i);
    connect(deleteButton[i], SIGNAL(clicked()), mapper, SLOT(map()));
}
connect(mapper, SIGNAL(mapped(int)), this, SLOT(deleteSlot(int)));
0

@MarekR22 zrobiłem tak jak napisałeś ale coś jednak nie trybi do końca. Może gdzieś robię błąd?

 
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>

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

    QPushButton* tab[10];
    tab[0] = ui->pushButton_1;
    tab[1] = ui->pushButton_2;
    tab[2] = ui->pushButton_3;
    tab[3] = ui->pushButton_4;
    tab[4] = ui->pushButton_5;
    tab[5] = ui->pushButton_6;
    tab[6] = ui->pushButton_7;
    tab[7] = ui->pushButton_8;
    tab[8] = ui->pushButton_9;
    tab[9] = ui->pushButton_10;

    mapper = new QSignalMapper(this);
    for(int i=0; i<10; i++)
    {
        mapper->setMapping(tab[i], i+1);
        connect(tab[i], SIGNAL(clicked()), mapper, SLOT(map()));
    }

    connect(mapper, SIGNAL(mapped(int)), this, SLOT(input()));
}

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

void MainWindow::input(int v)
{
    QString temp;
    temp = ui->lineEdit->text();
    temp += v;
    ui->lineEdit->setText(temp);
}

Aplikacja się kompiluje ale podczas uruchomienia widać komunikat: "QObject: Incompatible sender/receiver arguments
QPushButton::clicked() --> MainWindow::input(int)"

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