Как нажать кнопку в виджете, не в фокусе, не меняя фокус на нее - PullRequest
0 голосов
/ 06 января 2010

Я пытаюсь реализовать метод ввода с помощью 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 находится на «inputArea» в InputWidget.

Но когда я перемещаю мышь к ButtonWidget и щелкаю «selectedBtn», в ButtonWidget значения функций изменяются на «selectedBtn».

Как мне щелкнуть «selectedBtn», но все равно оставить «inputArea»? Благодаря ~


Так же, как мой комментарий, описанный в ответе Лоры, у InputWidget и ButtonWidget не может быть идентичных родителей, и я не могу использовать слот setWocus QWidget для изменения текущего фокуса между ними.

Ответы [ 3 ]

0 голосов
/ 06 января 2010

Вы можете получить то, что хотите, играя с focusPolicy для вашего виджета. Обратите внимание на параметр Qt::NoFocus. Я не думаю, что это предотвращает щелчки мышью на вашем виджете, но вы хотите проверить, чтобы убедиться.

0 голосов
/ 07 января 2010

Спасибо, Лора и cjhuitt, ваши ответы дают мне подсказку, чтобы решить мой вопрос.

Поскольку InputWidget и ButtonWidget являются двумя независимыми виджетами, если мы хотим иметь дело с проблемой фокуса между ними, нам нужен «глобальный» элемент управления, т.е. использовать QApplication для выполнения работы фокуса.

Ключевым моментом является использование слота "focusChanged" в QApplication и "activWindow" QWidget. Вот моя модификация.

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 голосов
/ 06 января 2010

Прежде всего, вам нужно, чтобы два виджета знали друг о друге. Как только вы это сделаете (установив текстовый виджет в виджет кнопки или добавив их обоих в один и тот же родительский виджет), вы можете попробовать посмотреть, может ли слот QWidget setFocus помочь вам (посмотрите также на другие слоты, некоторые может быть полезно для этого).

Возможно, реализовать что-то подобное в ButtonWidget:

  1. (в шапке) объявить сигнал foo ()
  2. (в конструкторе) подключить сигнал foo виджета кнопки к InputWidget s setFocus slot
  3. changeBtnText) после того, как вы сделали все, что хотели, emit foo()

Обратите внимание, что setFocus работает, если окно активно.

...