如何单击焦点外窗口小部件中的按钮而不更改当前焦点

时间:2010-01-06 07:10:32

标签: qt focus mouseevent

我正在尝试使用Qt Embedded实现一个输入法。

有一个查找表用于选择要输入的候选词。 “文本输入区”到“查找表”并且所选单词不能发送到“文本输入区”。

任何人都有任何想法解决这个问题?感谢〜


这里我举一个简单的例子:

的main.cpp

#include "InputWidget.h"
#include "ButtonWidget.h"
#include <QApplication>

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    InputWidget *inputWidget=new InputWidget();
    ButtonWidget *buttonWidget=new ButtonWidget();
    inputWidget->show();
    buttonWidget->show();
    int ref=app.exec();
    inputWidget->deleteLater();
    buttonWidget->deleteLater();
    return ref;
}

InputWidget.h

#include <QWidget>
#include <QPlainTextEdit>

#ifndef _InputWidget_H_
#define _InputWidget_H_

class InputWidget:public QWidget
{
Q_OBJECT
public:
    InputWidget(QWidget *parent=0);
private:
    QPlainTextEdit *inputArea;
};

#endif

InputWidget.cpp

#include "InputWidget.h"
#include <QPushButton>
#include <QVBoxLayout>

InputWidget::InputWidget(QWidget *parent):QWidget(parent)
{
    //input area setup
    inputArea=new QPlainTextEdit(this);
    //main layout
    QVBoxLayout *mainLayout=new QVBoxLayout(this);
    mainLayout->setContentsMargins(1,4,1,1);
    mainLayout->addWidget(inputArea);
    setLayout(mainLayout);
}

ButtonWidget.h

#include <QWidget>
#include <QPushButton>

#ifndef _ButtonWidget_H_
#define _ButtonWidget_H_

class ButtonWidget:public QWidget
{
Q_OBJECT
public:
    ButtonWidget(QWidget *parent=0);
private:
    QPushButton *selectedBtn;
public slots:
    void changeBtnText();
};

#endif

ButtonWidget.cpp

#include "ButtonWidget.h"
#include <QPushButton>
#include <QVBoxLayout>

ButtonWidget::ButtonWidget(QWidget *parent):QWidget(parent)
{
    //selectedBtn setup
    selectedBtn=new QPushButton(tr("Click Me!!"),this);
    connect(selectedBtn,SIGNAL(clicked()),this,SLOT(changeBtnText()));
    //main layout
    QVBoxLayout *mainLayout=new QVBoxLayout(this);
    mainLayout->setContentsMargins(1,4,1,1);
    mainLayout->addWidget(selectedBtn);
    setLayout(mainLayout);
}

void
ButtonWidget::changeBtnText()
{
    selectedBtn->setText("I am clicked :)");
}

这些代码会生成一个小部件,其中包含一个PlainTextEdit“inputArea”和一个具有PushButton“selectedBtn”的小部件。

首先,我在“inputArea”中输入了一些单词。当前的foucs位于InputWidget中的“inputArea”。

但是当我将鼠标移动到ButtonWidget并单击“selectedBtn”时,在ButtonWidget中将foucs更改为“selectedBtn”。

如何点击“selectedBtn”但仍保留“inputArea”的值?感谢〜


就像我在laura的回答中描述的那样,InputWidget和ButtonWidget可能没有相同的父级,我不能使用QWidget的“setFocus”槽来改变它们之间的当前焦点。

3 个答案:

答案 0 :(得分:0)

首先,您需要让两个小部件相互了解。完成后(通过将文本小部件设置为按钮小部件或将它们都添加到同一个父小部件),您可以尝试查看QWidget的setFocus插槽是否可以帮助您(也可以查看其他插槽) ,有些可能对此有用。)

也许在ButtonWidget

中实现类似的内容
  1. (在标题中)声明信号foo()
  2. (在构造函数中)将按钮小部件的foo信号连接到InputWidget的{​​{1}}插槽
  3. 完成所需的一切后,
  4. (在setFocus中)changeBtnText
  5. 注意,如果窗口处于活动状态,emit foo()可以正常工作。

答案 1 :(得分:0)

您可以通过玩小部件的focusPolicy来获得所需内容。请注意Qt::NoFocus选项。我认为它不会阻止鼠标点击您的小部件,但您需要进行测试以确定。

答案 2 :(得分:0)

感谢laura和cjhuitt,你的回答给了我一个很大的暗示来解决我的问题。

因为InputWidget和ButtonWidget是两个独立的小部件,如果我们想要处理它们之间的焦点问题,我们需要一个“全局”控件,即使用QApplication来完成焦点工作。

关键是使用QApplication的“focusChanged”插槽和QWidget的“activateWindow”。以下是我的修改。

的main.cpp

#include "InputWidget.h"
#include "ButtonWidget.h"
#include <QApplication>

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    InputWidget *inputWidget=new InputWidget();
    ButtonWidget *buttonWidget=new ButtonWidget(0,&app);
    inputWidget->show();
    buttonWidget->show();
    int ref=app.exec();
    inputWidget->deleteLater();
    buttonWidget->deleteLater();
    return ref;
}

ButtonWidget.h

#include <QWidget>
#include <QPushButton>
#include <QApplication>

#ifndef _ButtonWidget_H_
#define _ButtonWidget_H_

class ButtonWidget:public QWidget
{
Q_OBJECT
public:
    ButtonWidget(QWidget *parent=0,QApplication *app=0);
private:
    QPushButton *selectedBtn;
public slots:
    void changeBtnText();
    void changeFocus(QWidget *oldWidget,QWidget *curWidget);
};

#endif

ButtonWidget.cpp

#include "ButtonWidget.h"
#include <QPushButton>
#include <QVBoxLayout>

ButtonWidget::ButtonWidget(QWidget *parent,QApplication *app):QWidget(parent)
{
    //selectedBtn setup
    selectedBtn=new QPushButton(tr("Click Me!!"),this);
    connect(selectedBtn,SIGNAL(clicked()),this,SLOT(changeBtnText()));
    //main layout
    QVBoxLayout *mainLayout=new QVBoxLayout(this);
    mainLayout->setContentsMargins(1,4,1,1);
    mainLayout->addWidget(selectedBtn);
    setLayout(mainLayout);
    //deal with focus
    connect(app,SIGNAL(focusChanged(QWidget*,QWidget*)),this,SLOT(changeFocus(QWidget*,QWidget*)));
}

void
ButtonWidget::changeBtnText()
{
    selectedBtn->setText("I am clicked :)");
}

void
ButtonWidget::changeFocus(QWidget *oldWidget,QWidget *curWidget)
{
    if(oldWidget && curWidget==this)
        oldWidget->activateWindow();
}

不修改InputWidget.cpp和InputWidget。

此解决方案可以在此示例中使用,但我不确定它是否可以在两个独立的Qt程序中运行(它们有自己的QApplication),尤其是在Qt Embedded环境中。我会继续做一些测试。如果有任何结果,我也会在这里发布。

感谢您的讨论,我已经学到了很多,再次感谢大家!!