2010-01-06 36 views
0

我正在尝试使用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” 并具有一个按钮 “selectedBtn” 的微件的微件。

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

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

如何点击“selectedBtn”,但仍然保留“inputArea”?谢谢〜


就像在劳拉的回答说明我的意见,InputWidget和ButtonWidget可能没有相同的父母和我不能使用了QWidget的“的setFocus”插槽改变他们之间目前的工作重点。

+0

你可能想多解释一下,很难理解你想要做什么以及出了什么问题。一些代码片段也可能帮助人们帮助你。只需点击“编辑”并稍微更新你的问题。 – balpha 2010-01-06 07:37:06

回答

0

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

可能实现这样的事情,在ButtonWidget

  1. (在头)声明的信号FOO()
  2. (构造函数)按钮控件的伺服信号连接到InputWidgetsetFocus插槽
  3. (在changeBtnText)你做你想要的一切后,emit foo()

请注意,如果窗口处于活动状态,则setFocus可以工作。

+0

您的回答不适合我的情况,因为“inputArea”可能位于QT环境中运行的任何其他AP中,并且“selectedBtn”位于输入法面板中。他们可能是两个独立的程序,并没有相同的父母。但仍然感谢您的回答~~ – 2010-01-06 10:16:39

+0

我看到 - 从您的示例中不明显,您可以考虑将此评论添加到该问题。 – laura 2010-01-06 11:19:40

0

您可能可以通过为您的小部件玩focusPolicy而获得想要的结果。请注意0​​选项。我不认为它会阻止你的小部件上的鼠标点击,但你会想测试一下。

+0

我尝试在“selectedBtn”上设置focusPolicy(Qt :: NoFocus),但它不起作用。做了一些测试之后,我发现如果我在ButtonWidget中创建另一个PushButton“testBtn”,请在“selectedBtn”上设置focusPolicy(Qt :: NoFocus),并执行我的问题中描述的步骤。焦点仍然会改变为ButtonWidget,而selectedBtn点击的信号仍然会被触发,但重点在于“testBtn”。即,focusPolicy似乎只适用于具有相同父项的小部件。但仍然感谢您的回复~~ – 2010-01-07 03:25:42

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环境中。我会继续对它进行一些测试。如果有任何结果,我也会在这里发布。

感谢这次讨论,我学到了很多东西,再次感谢大家!

+0

此解决方案仍然不适合“输入法”,因为即使将当前焦点重置为InputWidget,InputWidget也会发出“焦点输出”事件。 “注意力不集中”事件会导致输入法重置所有状态,并且所选单词也被取消。也许我应该尝试在QInputContext或QWSInputMethod中找到关于此主题的其他信息。 – 2010-01-07 06:49:20