2014-01-16 9 views
1

나는 3 개의 QToolButton을 갖는 응용 프로그램을 구현 중이고 초점이 올 때 QToolButton 인 경우 resize이어야합니다. 내 친구 중 한 명이 대답을주었습니다. 그러나 내 주 윈도우에서 QMainWindow 클래스를 상속 받고 있기 때문에 그것을 파악할 수 없습니다. 그는 QToolButton도 상속 받고 있다고 말하고 있습니다. 그러나 다중 상속 문제가 발생할 것입니다. 따라서 정확하게 사용하는 방법 focusInEvent().focusInEvent 및 focusOutEvent 사용 방법

MyCode: 
mywindow.h : 

class mywindow : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    mywindow() ; 

protected: 
    void keyReleaseEvent(QKeyEvent *event); 
    void focusInEvent(QFocusEvent *event); 
    void focusOutEvent(QFocusEvent *event); 

private: 
    QWidget *widget; 
    QStackedWidget *stack1; 
    QToolBar *tool; 
    QListWidget *list1; 
    QListWidget *list2; 
    QVBoxLayout *vertical; 
    QToolButton *button1; 
    QToolButton *button2; 
    QToolButton *button3; 

public slots: 
    void fileNew(); 
    void file(); 
    bool eventFilter(QObject *object, QEvent *event); 

}; 

mywindow.cpp :

mywindow::mywindow() : QMainWindow() 
{ 
    //some code 
} 
내가 병합해야

내 친구의 코드 :

class mywindow : public QToolButton 
{ 
    private: 
     int originalWidth, originalHeight; 
     int bigWidth, bigHeight; 
}; 

void focusInEvent (QFocusEvent * event) { 
        resize(bigWidth,bigHeight); 
        QToolButton::focusInEvent(event); 
} 

void focusOutEvent (QFocusEvent * event) { 
        resize(originalWidth,originalHeight); 
        QToolButton::focusOutEvent(event); 
} 

답변

3

는 통화 당이

class YourButton : public QToolButton 
{ 
    Q_OBJECT 

    protected: 

    void focusInEvent(QFocusEvent* e); 
    void focusOutEvent(QFocusEvent* e); 
}; 

같은 것을해야 파일

void YourButton::focusInEvent(QFocusEvent* e) 
{ 
    if (e->reason() == Qt::MouseFocusReason) 
    { 
     // Resize the geometry -> resize(bigWidth,bigHeight); 
    } 


    QToolButton::focusInEvent(e); 
} 

그런 다음 mainWindow에서 yourButton 클래스를 사용하십시오.

(다른 옵션)도 메인 윈도우에서 http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter을 사용할 수 있습니다.

+0

QPushButton:focus { min-height: 40px min-width: 72px } 
: 당신이 QToolButton을 상속하는 새로운 클래스를 만들 필요가 – Rupesh

+0

선언되지 않은 'YourButtton'을 (예 내가 YourButton했다 YourButton.h 및 YourButton.cpp). .h 파일에서 protected : foucusInEvent()를 재정의하고 .cpp 파일에서 YourButton의 크기 조정을 구현할 수 있습니다. 이 링크 응답 http://stackoverflow.com/questions/2804115/qlineedit-focus-event를 참조하십시오. myowindow 클래스에서이 YourButton을 사용해야합니다. – Wagmare

+0

커스텀 위젯을 만드는 방법을 보여주기 위해 당신을 위해 serching하고 있지만 적절한 예제를 찾을 수 없습니다. qt 예제에서는 analogclock 인 shapeClock을 따라갈 수 있지만 그다지 관련성은 없습니다. 이 포럼의 누군가가 그를 도울 수 있다면 .. 제발 .. – Wagmare

1

@Wagmare의 솔루션은 레이아웃 외부의 버튼에서만 작동합니다. 그것은 다음과 같아야 레이아웃의 내부 작동하게하려면

class YourButton : public QToolButton 
{ 
    Q_OBJECT 
    // proper constructor and other standard stuff 
    // .. 

protected: 
    void focusInEvent(QFocusEvent* e) { 
     QToolButton::focusInEvent(e); 
     updateGeometry(); 
    } 

    void focusOutEvent(QFocusEvent* e) { 
     QToolButton::focusOutEvent(e); 
     updateGeometry(); 
    } 


public: 
    QSize sizeHint() const { 
     QSize result = QToolButton::sizeHint(); 
     if (hasFocuc()) { 
      result += QSize(20,20); 
     } 
     return result; 
    } 
}; 

을 그것도 레이아웃없이 작동합니다 적절한 크기의 정책.


서브 클래스없이 또 다른 멋진 솔루션은 스타일 시트입니다 :

그것은이 오류주고있다