如何使用 focusInEvent 和 focusOutEvent [重复]

Posted

技术标签:

【中文标题】如何使用 focusInEvent 和 focusOutEvent [重复]【英文标题】:How to use focusInEvent and focusOutEvent [duplicate] 【发布时间】:2014-01-16 06:53:37 【问题描述】:

我正在实现一个应用程序,其中我有 3 个QToolButton,当焦点位于任何QToolButton 上时,它应该是resize。 我的一位朋友给了我答案,但我无法弄清楚,因为我在 mainWindow 中也继承了QMainWindow 类。他说也要继承QToolButton。但是会出现多重继承问题。那么具体如何使用focusInEvent()

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);

【问题讨论】:

【参考方案1】:

你应该这样做

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。

【讨论】:

它给出了这个错误:'YourButton' has not been declared 您必须创建一个继承 QToolButton 的新类(例如,我将 YourButton 指定为 YourButton.h 和 YourButton.cpp)。然后在 .h 文件中覆盖受保护的: foucusInEvent() 并在 .cpp 文件中实现 YourButton 的大小调整。请参阅此链接答案***.com/questions/2804115/qlineedit-focus-event。那么你必须在你的 mywindow 类中使用这个 YourButton。 我正在为您展示如何创建自定义小部件,但无法找到合适的示例。您可以遵循 qt 示例中的模拟时钟、形状时钟,但相关性不大。如果这个论坛中的任何人可以帮助他..请做.. qt-project.org/doc/qt-4.8/widgets-analogclock.html 和 books.google.co.in/… 可以帮助您 我已经写了所有东西,但它不起作用。没有错误发生【参考方案2】:

@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

【讨论】:

以上是关于如何使用 focusInEvent 和 focusOutEvent [重复]的主要内容,如果未能解决你的问题,请参考以下文章

QLineEdit 上的活动休假

如何确保小部件上的两个标签之一并排获得focusInEvent?

使用 .focused() 点击不同视图时如何删除 TextField 焦点?

如何通过 react/next js 删除 :focus 伪类?

如何让 window.focus() 在 Firefox 中工作 [重复]

单击外部时如何关闭Android对话框(使用FLAG_NOT_FOCUSABLE)