如何使用 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何确保小部件上的两个标签之一并排获得focusInEvent?
使用 .focused() 点击不同视图时如何删除 TextField 焦点?
如何通过 react/next js 删除 :focus 伪类?