找回密码
 立即注册
收起左侧

QT有一个按钮控件1,点击既可以发送到lineEdit1 也可以发送...

9
回复
8933
查看
[复制链接]
累计签到:14 天
连续签到:1 天
来源: 2014-4-15 09:19:39 显示全部楼层 |阅读模式
1Qter豆
问题详细如下:
lineEdit1获取焦点 ---点击按钮1 --- lineEdit1 获取按钮1的数据1
lineEdit2获取焦点---点击按钮1 --- lineEdit2 获取按钮1的数据1

其实就像软件盘的东西,关键是焦点如何捕捉呢 大神解救啊

最佳答案

查看完整内容

不开玩笑了,我肯定地说:全局变量的作用域就是全局,不会在一个函数赋值之后在另一个函数无效,绝不可能。软件工程师我会乱讲?我才发现上个代码写的确实有点问题不过你应该能看出来才对,我写的一切都是参考,我错加了一句: else if (event->type()==QEvent::FocusOut) m_flag = -1; 这句话在点击按钮的时候触发了,所以才一直是-1。附上完整代码: #include "mainwindow.h" #include "ui_mainwindow.h" int g ...
回复

使用道具 举报

累计签到:47 天
连续签到:1 天
2014-4-15 09:19:40 显示全部楼层
zhulei 发表于 2014-4-18 09:56
可能你没懂我的意思,我是说你在eventFilter()这个函数中给全局变量赋新的值,在其函数内有效的 但是当 ...

不开玩笑了,我肯定地说:全局变量的作用域就是全局,不会在一个函数赋值之后在另一个函数无效,绝不可能。软件工程师我会乱讲?我才发现上个代码写的确实有点问题不过你应该能看出来才对,我写的一切都是参考,我错加了一句:
else if (event->type()==QEvent::FocusOut)
              m_flag = -1;
这句话在点击按钮的时候触发了,所以才一直是-1。附上完整代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"

int g_flag = -1;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit->installEventFilter(this);
    ui->lineEdit_2->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == ui->lineEdit)
    {
        if (event->type() == QEvent::FocusIn)
            g_flag = 1;
    }
    else if(watched == ui->lineEdit_2)
    {
        if (event->type() == QEvent::FocusIn)
            g_flag = 2;
    }
}

void MainWindow:n_pushButton_clicked()
{
    if(1 == g_flag)
        ui->lineEdit->setText("1");
    else if(2 == g_flag)
        ui->lineEdit_2->setText("2");
}
//这样有一个小问题,就是当点过几次以后无论是否有focusin事件,变量g_flag都会有非-1的值,不过这就简单了
回复

使用道具 举报

累计签到:47 天
连续签到:1 天
2014-4-15 10:50:48 显示全部楼层
当然,有可能不止两个lineEdit,所以最好的方法是把所有lineEdit都安装事件过滤器:
声明   bool eventFilter(QObject *,QEvent *);
安装   lineedit0->installEventFilter(this);
    lineedit1->installEventFilter(this);
    lineedit2->installEventFilter(this);
    lineedit3->installEventFilter(this);
    lineedit4->installEventFilter(this);
    lineedit5->installEventFilter(this);
bool Information::eventFilter(QObject *watched, QEvent *event)
{
    if (watched==lineedit0)         //首先判断控件(这里指 lineEdit1)
    {
        if (event->type()==QEvent::FocusIn)     //然后再判断控件的具体事件
            ui->lineEdit->setText("xxxxxxx");
        else if (event->type()==QEvent::FocusOut)
        {
        }
  if (watched==lineedit1)
同上

回复

使用道具 举报

累计签到:410 天
连续签到:1 天
2014-4-15 11:41:19 显示全部楼层
你看看 focus相关方法
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2014-4-15 11:48:57 显示全部楼层
Downing 发表于 2014-4-15 10:50
当然,有可能不止两个lineEdit,所以最好的方法是把所有lineEdit都安装事件过滤器:
声明   bool eventFil ...

bool Information::eventFilter(QObject *watched, QEvent *event)
{
    if (watched==lineedit0)         //首先判断控件(这里指 lineEdit1)
    {
        if (event->type()==QEvent::FocusIn)     //然后再判断控件的具体事件
           //ui->lineEdit0->setText("xxxxxxx");
             connect(ui->p1Button,SIGNAL(clicked()),this,SLOT(p1()));
        else if (event->type()==QEvent::FocusOut)
        {
        }
     }
     if (watched==lineedit1)         //首先判断控件(这里指 lineEdit1)
    {
        if (event->type()==QEvent::FocusIn)     //然后再判断控件的具体事件
           //ui->lineEdit1->setText("xxxxxxx");
             connect(ui->p1Button,SIGNAL(clicked()),this,SLOT(p2()));
        else if (event->type()==QEvent::FocusOut)
        {
        }
     }
}
void p1()
{
ui->lineEdit0->setText("1");
}
void p2()
{
  ui->lineEdit1->setText("1");
}

像这样吗
可不可以 直接就是用一个槽函数如:
void p()
{
//这里进行窗口判断 哪个lineEdit获取了焦点
if(lineEdit0)
{
//处理
}
else if(lineEdit1)
{
//处理
}
回复

使用道具 举报

累计签到:47 天
连续签到:1 天
2014-4-17 11:22:31 显示全部楼层
zhulei 发表于 2014-4-15 11:48
bool Information::eventFilter(QObject *watched, QEvent *event)
{
    if (watched==lineedit0)       ...

原谅我没有非常仔细读你的需求,不过完全可以借助我给你的代码来实现,具体到你这个程序的话这样做:
在整个类中添加一个全局或成员变量int m_flag = -1;然后
  if (watched==lineedit1)
    {
        if (event->type()==QEvent::FocusIn)
              m_flag = 1;
        else if (event->type()==QEvent::FocusOut)
              m_flag = -1;
     }
else if (watched==lineedit2)
    {
        if (event->type()==QEvent::FocusIn)
              m_flag = 2;
        else if (event->type()==QEvent::FocusOut)
              m_flag = -1;
     }
else  if (watched==lineedit3)
    {
        if (event->type()==QEvent::FocusIn)
              m_flag = 3;
        else if (event->type()==QEvent::FocusOut)
              m_flag = -1;
     }//依次类推
这样点击按钮的时候就会触发一个槽
on_btn_clicked()
{
      if(1 == m_flag)
      {
            lineedit1->settext(btn->text());
      }else  if(2 == m_flag)
      {
            lineedit2->settext(btn->text());
      }//继续写下去
}
这样绝对可行,我这个方法只是我随意想出来的不一定是最好的,但是肯定能实现
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2014-4-17 15:09:15 显示全部楼层
Downing 发表于 2014-4-17 11:22
原谅我没有非常仔细读你的需求,不过完全可以借助我给你的代码来实现,具体到你这个程序的话这样做:
在 ...

全局变量在函数内赋值只在当前函数内有效啊  在点击按钮时槽中的标志 m_flag 一直为-1
回复

使用道具 举报

累计签到:47 天
连续签到:1 天
2014-4-18 09:25:10 显示全部楼层
zhulei 发表于 2014-4-17 15:09
全局变量在函数内赋值只在当前函数内有效啊  在点击按钮时槽中的标志 m_flag 一直为-1
...

应该不会,“全局”变量不能给全局用岂不是徒有虚名。你在哪里定义的?在头文件包含那地方定义就行。要不就直接弄成成员变量。首先你点一个lineedit,保证有一个是focus状态,那么这个变量的值才会变
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2014-4-18 09:56:48 显示全部楼层
Downing 发表于 2014-4-18 09:25
应该不会,“全局”变量不能给全局用岂不是徒有虚名。你在哪里定义的?在头文件包含那地方定义就行。要不 ...

可能你没懂我的意思,我是说你在eventFilter()这个函数中给全局变量赋新的值,在其函数内有效的 但是当你在on_btn_clicked()这个函数中进行判定的时候
如if(1 == m_flag)
      {
            lineedit1->settext(btn->text());
      }else  if(2 == m_flag)
      {
            lineedit2->settext(btn->text());
      }//继续写下去

其实m_flag 认为初始值-1,改变的效果只在eventFilter()中有效 我测试过了像这样不行的 原理上不对
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2014-4-21 09:24:02 显示全部楼层
Downing 发表于 2014-4-19 09:39
不开玩笑了,我肯定地说:全局变量的作用域就是全局,不会在一个函数赋值之后在另一个函数无效,绝不可能 ...

嗯 的确是 else if (event->type()==QEvent::FocusOut)
              m_flag = -1;
这个原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了