2014-01-16 5 views
1

Я реализую приложение, в котором у меня есть 3 QToolButton, и когда фокус наступает на любом QToolButton, он должен resize. Один из моих друзей дал мне ответ, но я не могу понять, как я наследую класс QMainWindow, а также в моем mainWindow. Он говорит наследовать 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); 
}; 

в .cpp файл

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


    QToolButton::focusInEvent(e); 
} 

затем используйте класс yourButton в своем mainWindow.

также (другой вариант) вы можете использовать http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter в вашем главном окне.

+0

Это дает эту ошибку: «YourButtton» не был объявлен – Rupesh

+0

вы должны создать новый класс, наследующий QToolButton (пример я дал YourButton как YourButton.h и YourButton.cpp). то в .h файле вы переопределяете protected: foucusInEvent() и в .cpp-файле, вы можете реализовать изменение размера YourButton. см. эту ссылку answer http://stackoverflow.com/questions/2804115/qlineedit-focus-event. то вы должны использовать этот YourButton в своем классе mywindow. – Wagmare

+0

Я заставляю вас показать, как создать пользовательский виджет, но не смог найти подходящий пример. вы можете следовать аналоговому ключу, formClock в примерах qt, но не так уж важно. если кто-либо на этом форуме может ему помочь .. сделайте это .. – 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; 
    } 
}; 

При правильной политике размера она также будет работать без макета.


Еще один крутой раствор без подклассов таблица стилей:

QPushButton:focus { 
    min-height: 40px 
    min-width: 72px 
}