Qt - QSpinBox

0

Chciałbym zapytać czy jest ktoś kto wie i chętnie podzieliłby się wiedzą na temat programowania strzałek w QSpinBox ?

Co trzeba zrobić aby strzałka w górę wywoływała inny slot, a strzałka w dół inny ?

Bo mam problem z tabelkami tj z dodawaniem i usuwaniem rekordów dla klasy QSqlTableModel. Rekordy mi się dodają ale nie w takiej kolejności jak trzeba i obydwa przyciski dodają rekordy.

1

W dokumentacji widzę tylko sygnał valueChanged. Czyli można podpiąć slot tylko na zmianę wartości. Samo rozróżnienie trzeba przeprowadzić w slocie.
https://doc.qt.io/qt-5/qspinbox.html#valueChanged
Ale nic straconego. Można zapamiętać wartość jaka jest w kontrolce i przy każdej zmianie porównywać, np. coś takiego

private:
	int staraWartoscZDupy = 0;
...
	void Klasa::slot(int wartoscZDupy) {
		if (wartoscZDupy > staraWartoscZDupy) {
			//strzałka w górę
		} else {
			//strzałka w dół
		}

		staraWartoscZDupy = wartoscZDupy;
	}
1

Czyli można podpiąć slot tylko na zmianę wartości

A jak się ma to do wpisania wartości z łapy? Bo z tego co zrozumiałem, to OP nie pyta o samą zmianę wartości wpisanej do edita, tylko chce reagować na wciśnięcia strzałek. W podanym przez Ciebie przykładzie, akcja zostanie wywołana także, jeśli ktoś wpiszę liczbę ręcznie, a nie skorzysta z przycisków. Pytanie do OP - czy takie coś może być?

1
cerrato napisał(a):

Czyli można podpiąć slot tylko na zmianę wartości

A jak się ma to do wpisania wartości z łapy? Bo z tego co zrozumiałem, to OP nie pyta o samą zmianę wartości wpisanej do edita, tylko chce reagować na wciśnięcia strzałek. W podanym przez Ciebie przykładzie, akcja zostanie wywołana także, jeśli ktoś wpiszę liczbę ręcznie, a nie skorzysta z przycisków. Pytanie do OP - czy takie coś może być?

Ręczne wpisanie wartości też spowoduje wywołanie slotu. Przykład, który podałem, powinien spełniać oczekiwania, bo w polu można wpisać tylko liczby, a te w slocie będą tylko mniejsze albo większe od ustalonej zmiennej.

0

Wpisanie wartości z palca też jak najbardziej wchodzi w grę. Bo gdybym z góry założył tylko używanie strzałek to musiałbym zablokować możliwość wpisania w pole.

Przetestuję podaną propozycję i dam znać co mi wyszło.

1
zkubinski napisał(a):

Chciałbym zapytać czy jest ktoś kto wie i chętnie podzieliłby się wiedzą na temat programowania strzałek w QSpinBox ?

Co trzeba zrobić aby strzałka w górę wywoływała inny slot, a strzałka w dół inny ?

Z tego co wiem, to strzałki w SpinBox nie są przyciskami per se, więc musiałbyś "łapać" to ręcznie tzn. nadpisać obsługę kliknięcia (mousePressEvent i mouseReleaseEvent), obliczyć pozycję strzałek, sprawdzić gdzie kliknięcie nastąpiło i odpalać wtedy własny sygnał.

Jeśli nie ma dla Ciebie znaczenia czy wartość była zmieniona myszką/klawiszami/wpisaniem to propozycja @PerlMonk wydaje się ok.

0

Masz rację. Parę dni temu znalazłem taki kod

void MySpinBox::mousePressEvent(QMouseEvent* event)
{
     QSpinBox::mousePressEvent(event);

    QStyleOptionSpinBox opt;
    this->initStyleOption(&opt);

    if( this->style()->subControlRect(QStyle::CC_SpinBox, &opt, QStyle::SC_SpinBoxUp).contains(event->pos()) )
        // UP BUTTON PRESSED
    else if( this->style()->subControlRect(QStyle::CC_SpinBox, &opt, QStyle::SC_SpinBoxDown).contains(event->pos()) )
        //DOWN BUTTON PRESSED
}

i się nad nim zastanawiam jak go użyć ;) Domyślam się, że musiałbym zrobić własną klasę dziedziczącą po QSpinBox.

2

To jest problem XY.
Chcesz coś osiągnąć czego nie opisujesz, w sposób który jest dziwny i prosisz jak naprawić dziwne rozwiązanie, zamiast zacząć od opisu pierwotnego problemu/zadania.

Zacznij tak:
"Jako użytkownik końcowy chcę, by gdy widzę XXXXX i nacisnę YYY to się ma stać ZZZZ. Przy czym ... .. .. ..

Mieszanie do tego styli uważam za ślepy zaułek.

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