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

Odpowiedz Nowy wątek
2011-07-26 23:29
Kyhu
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:)

Pozostało 580 znaków

2011-07-26 23:54
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


"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 :]

Pozostało 580 znaków

2011-07-27 11:18
Kyhu
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?:)

Pozostało 580 znaków

2011-07-27 13:05
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


"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 1x, ostatnio: MasterBLB, 2011-07-27 13:06

Pozostało 580 znaków

2011-07-28 16:04
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)));

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2011-07-28 16:04

Pozostało 580 znaków

2013-05-03 19:17
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::connect: Incompatible sender/receiver arguments
QPushButton::clicked() --> MainWindow::input(int)"

komunikat jest jasny, łączysz ze sobą niegodne sloty i sygnały: łączysz QPushButton z MainWindow. Najprawdopodobniej coś się źle skompilowało i uruchomiłeś stary kod, bo nie widzę w twoim kodzie takiego połączenia. - MarekR22 2013-05-08 19:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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