QSpinBox를 클릭하면 창을 열고 싶습니다. 문제는이 위젯에 대해 "클릭 된"신호가 존재하지 않는다는 것입니다. 누군가 그렇게 할 생각이 있습니까?QSpinBox의 신호 Qt
0
A
답변
1
QSpinBox
은 입력 확인과 이벤트 처리라는 두 개의 버튼이있는 QLineEdit
입니다. 은 마우스를 직접 다루기로되어 있기 때문에 신호를 클릭하지 않았습니다.
QSpinBox
에서 파생 된 사용자 정의 위젯을 만들 때조차도 마우스 이벤트 자체를받지 못하기 때문에 충분하지 않은 문제는 자식 위젯에 의해 처리된다는 것입니다. 클릭 이벤트를 잡으려고 아이들 QSpinBox
에 이벤트 필터를 설치할 수는 있지만 가장 깔끔한 방법은 아닙니다.
사용자가 상자를 선택할 때 숫자 패드 만 표시하려면 직접 QLineEdit
을 사용할 수 있습니다. QSpinBox
버튼을 잃어 버릴 수 있지만 (필요한 경우 자신의 버튼을 추가 할 수 있습니다) 유효성 검사 (그러나 QValidator
을 사용하여 자신을 추가 할 수 있습니다).
class MySpinBox: public QLineEdit
{
Q_OBJECT
public:
MySpinBox(QWidget *parent = 0);
~MySpinBox();
signals:
needNumpad(bool hasFocus);
protected:
virtual void focusInEvent(QFocusEvent *e) {
QLineEdit::focusInEvent(e);
emit(needNumpad(true));
}
virtual void focusOutEvent(QFocusEvent *e) {
QLineEdit::focusInEvent(e);
emit(needNumpad(false));
}
}
0
당신은 이벤트 필터를 사용하고 같은 것을 할 수 있습니다 :
을 다음그냥 focus
이벤트를 잡기 위해를 도출해야 키보드를 표시 할 사용자 정의 신호를 트리거
ui->spinBox->installEventFilter(this);
QObjectList o_list = ui->spinBox->children();
for(int i = 0; i < o_list.length(); i++)
{
QLineEdit *cast = qobject_cast<QLineEdit*>(o_list[i]);
if(cast)
cast->installEventFilter(this);
}
그리고 이벤트 필터에서 마우스 클릭 (이 예제에서는 모든 마우스 버튼, 왼쪽 클릭, 오른쪽 클릭, 스크롤 휠 클릭 등으로 트리거 됨)을 확인합니다.
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress)
{
showNumpadDialog();
}
return false;
}
0
QLineEdit과 두 개의 버튼으로 나만의 QSpinBox를 만들 필요는 없습니다.
QLineEdit는 QSpinBox의 하위 항목이기 때문에. QLineEdit에 대한 이벤트 필터를 작성하고 해당 상위가 스핀 상자인지 여부를 점검 할 수 있습니다. 그러면 스핀 상자에 대한 클릭 이벤트가 발생합니다.
if(event->type() == QEvent::MouseButtonPress && dynamic_cast<QSpinBox *>(dynamic_cast<QLineEdit *>(obj)->parent()))
왜 사용자가 스핀 상자 값을 변경하도록 하시겠습니까? QSpinBox는 * clicked * 시그널을 가지고 있지 않습니다. 사용자 정의 위젯이 필요한 것 같습니다. – zakinster
촉각 응용 프로그램입니다. 사용자가 spinBow를 클릭했을 때 번호가 – federem
인 숫자 패드 응용 프로그램을 열어 보겠습니다. 따라서 'QSpinBox'버튼을 사용하지 않으면 간단한 QLineEdit을 사용하지 않으시겠습니까? – zakinster