首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用focusInEvent和focusOutEvent

如何使用focusInEvent和focusOutEvent
EN

Stack Overflow用户
提问于 2014-01-16 14:53:38
回答 2查看 14.1K关注 0票数 2

我正在实现一个应用程序,其中我有3个QToolButton,当焦点出现在任何QToolButton上时,它应该是resize。我的一个朋友给了我答案,但我无法理解,因为我的mainWindow中也继承了QMainWindow类。他也告诉我们要继承QToolButton。但是会出现多重继承问题。那么到底该如何使用focusInEvent()呢?

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
mywindow::mywindow() : QMainWindow()
{   
  //some code
}

我朋友的代码,我必须合并:

代码语言:javascript
运行
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-16 15:08:37

你应该这样做

代码语言:javascript
运行
复制
class YourButton : public QToolButton
{
    Q_OBJECT

    protected:

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

在.cpp文件中

代码语言:javascript
运行
复制
void YourButton::focusInEvent(QFocusEvent* e)
{
    if (e->reason() == Qt::MouseFocusReason)
    {
      // Resize the geometry -> resize(bigWidth,bigHeight); 
    }


    QToolButton::focusInEvent(e);
}

然后在mainWindow中使用yourButton类。

另外(另一种选择)你可以在你的mainWindow中使用http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter

票数 3
EN

Stack Overflow用户

发布于 2014-01-16 18:25:54

@Wagmare的解决方案只适用于布局之外的按钮。要让它在布局中工作,它应该看起来像这样:

代码语言:javascript
运行
复制
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;
    }
};

有了适当的大小策略,它也可以在没有布局的情况下工作。

另一个没有子类化的很酷的解决方案是样式表:

代码语言:javascript
运行
复制
QPushButton:focus {
    min-height: 40px
    min-width:  72px
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21155148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档