Qt键盘事件

2023-11-07

#ifndef COMPLETELINEEDIT_H
#define COMPLETELINEEDIT_H

#include <QtGui/QLineEdit>
#include <QStringList>

class QListView;
class QStringListModel;
class QModelIndex;

class CompleteLineEdit : public QLineEdit {
    Q_OBJECT
public:
    CompleteLineEdit(QStringList words, QWidget *parent = 0);

public slots:
    void setCompleter(const QString &text); // 动态的显示完成列表
    void completeText(const QModelIndex &index); // 点击完成列表中的项,使用此项自动完成输入的单词

protected:
    virtual void keyPressEvent(QKeyEvent *e);
    virtual void focusOutEvent(QFocusEvent *e);

private:
    QStringList words; // 整个完成列表的单词
    QListView *listView; // 完成列表
    QStringListModel *model; // 完成列表的model
};

#endif // COMPLETELINEEDIT_H

-------------------------------------CompleteLineEdit.cpp-------------------------------------
#include "CompleteLineEdit.h"
#include <QKeyEvent>
#include <QtGui/QListView>
#include <QtGui/QStringListModel>
#include <QDebug>

CompleteLineEdit::CompleteLineEdit(QStringList words, QWidget *parent)
    : QLineEdit(parent), words(words) {
    listView = new QListView(this);
    model = new QStringListModel(this);
    listView->setWindowFlags(Qt::ToolTip);

    connect(this, SIGNAL(textChanged(const QString &)), this, SLOT(setCompleter(const QString &)));
    connect(listView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(completeText(const QModelIndex &)));
}

void CompleteLineEdit::focusOutEvent(QFocusEvent *e) {
    //listView->hide();
}

void CompleteLineEdit::keyPressEvent(QKeyEvent *e) {
    if (!listView->isHidden()) {
        int key = e->key();
        int count = listView->model()->rowCount();
        QModelIndex currentIndex = listView->currentIndex();

        if (Qt::Key_Down == key) {
            // 按向下方向键时,移动光标选中下一个完成列表中的项
            int row = currentIndex.row() + 1;
            if (row >= count) {
                row = 0;
            }

            QModelIndex index = listView->model()->index(row, 0);
            listView->setCurrentIndex(index);
        } else if (Qt::Key_Up == key) {
            // 按向下方向键时,移动光标选中上一个完成列表中的项
            int row = currentIndex.row() - 1;
            if (row < 0) {
                row = count - 1;
            }

            QModelIndex index = listView->model()->index(row, 0);
            listView->setCurrentIndex(index);
        } else if (Qt::Key_Escape == key) {
            // 按下Esc键时,隐藏完成列表
            listView->hide();
        } else if (Qt::Key_Enter == key || Qt::Key_Return == key) {
            // 按下回车键时,使用完成列表中选中的项,并隐藏完成列表
            if (currentIndex.isValid()) {
                QString text = listView->currentIndex().data().toString();
                setText(text);
            }

            listView->hide();
        } else {
            // 其他情况,隐藏完成列表,并使用QLineEdit的键盘按下事件
            listView->hide();
            QLineEdit::keyPressEvent(e);
        }
    } else {
        QLineEdit::keyPressEvent(e);
    }
}

void CompleteLineEdit::setCompleter(const QString &text) {
    if (text.isEmpty()) {
        listView->hide();
        return;
    }

    if ((text.length() > 1) && (!listView->isHidden())) {
        return;
    }

    // 如果完整的完成列表中的某个单词包含输入的文本,则加入要显示的完成列表串中
    QStringList sl;
    foreach(QString word, words) {
        if (word.contains(text)) {
            sl << word;
        }
    }

    model->setStringList(sl);
    listView->setModel(model);

    if (model->rowCount() == 0) {
        return;
    }

    // Position the text edit
    listView->setMinimumWidth(width());
    listView->setMaximumWidth(width());

    QPoint p(0, height());
    int x = mapToGlobal(p).x();
    int y = mapToGlobal(p).y() + 1;

    listView->move(x, y);
    listView->show();
}

void CompleteLineEdit::completeText(const QModelIndex &index) {
    QString text = index.data().toString();
    setText(text);
    listView->hide();
}

-------------------------------------main.cpp----------------------------------
#include <QtGui/QApplication>
#include "CompleteLineEdit.h"
#include <QtGui>
#include <QCompleter>
#include <QStringList>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    QStringList sl = QStringList() << "Biao" << "Bin" << "Huang" << "Hua" << "Hello" << "BinBin" << "Hallo";
    QWidget widgetw;
    CompleteLineEdit * edit= new CompleteLineEdit(sl);
    QPushButton *button = new QPushButton("Button");
    QHBoxLayout *layout = new QHBoxLayout();
    layout->addWidget(edit);
    layout->addWidget(button);
    widgetw.setLayout(layout);

    widgetw.show();

    CompleteLineEdit e(sl);
    e.show();

    return a.exec();
}


FROM:  http://blog.chinaunix.net/uid-25900151-id-372196.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt键盘事件 的相关文章

随机推荐

  • Jsp文件修改后不生效怎么办?

    修改Jsp界面并保存 然而在浏览器里面却始终不生效 清缓存重启Tomcat都没用 网上搜了挺久 大多都是说缓存的问题 偶然看到有个前辈提了下文件修改时间的问题 由于某些原因 我确实把系统时间给改了 后来把时间改回来后重新部署项目就正常了 如
  • 设计模式之六大原则

    关于设计模式的六大设计原则的资料网上很多 但是很多地方解释地都太过于笼统化 我也找了很多资料来看 发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂 因此转载过来 原作者博客链接 http blog csdn net LoveLi
  • 【Linux】Linux下 CURL如何发送http请求

    1 概述 命令如下 curl i k H Content Type application json X POST d data loginUser ip 192 168 xx xxx name lcc token xxxxxxxx tim
  • 关于mysql_connect()函数不能连接mysql的解决

    之前我已经搭建好了LAMP Linux Apache MySql PHP 可以参照我之前的相关博客搭建 今天想试一下在php连接mysql 但是却没有成功 使用的代码如下
  • Linux LED驱动开发实验(直接操作寄存器 -- 实际开发很少这样做)

    目录 Linux 下LED 灯驱动原理 地址映射 ioremap映射 iounmap释放 I O 内存访问函数 硬件原理图分析 实验程序编写 LED 灯驱动程序编写 APP测试程序编写 运行测试 编译驱动程序和测试APP 拷贝led ko
  • 电子计算机是机电一体化产品,关于机电一体化产品所有包括的范围

    磁翻板液位计在新技术革命浪潮中 自动化技术已经深入到工厂 农村 办公室和机关 家庭以及社会各个方面 有人称之为 四A革命 即 WVW磁翻板液位计 玻璃管液位计 浮球液位计 玻璃板液位计 双色液位计 工厂自动化 FA WVW磁翻板液位计 玻璃
  • 客户端log日志系统

    背景 我们在开发过程中出现了个别bug 而我们往往很难定位到问题所在 这个不仅仅局限于移动端 只是移动端不容易定位问题 我们常见的实现方式可能是 1 创建一个带队列的线程 2 把要上报的数据抛入线程队列中 3 数据过多本地写入文件 4 线程
  • 报错SystemError: java.nio.file.InvalidPathException: Illegal char <:> at index 2

    背景 使用jpype调用Java接口 代码如下 from jpype import path getDefaultJVMPath startJVM path ea java lang System out println Hello Wor
  • Vue2和Vue3的区别和变化

    vue2和vue3数据双向绑定原理发生改变 vue2 vue2的数据双向绑定Q 原理使用的是es5的数据劫持obiect defineProperty配合发布订阅模式来实现 优点 兼容性相对好 vue3 通过proxy的api Reflec
  • python 爬取简历案例

    import requests import os from lxml import etree if name main if not os path exists sucai os mkdir sucai headers User Ag
  • 对比分析:SFrame,Hdp2与skflow,谁更好呢?

    数据科学必备少不了一些框架和库 今天我们大圣众包小编为大家对比分析下SFrame Hdp2与skflow 看看这三个哪个更好呢 1 SFrame 这家公司最初的名字叫graphlab 后来改名为dato 最近又进行了一次改名 叫turi了
  • UE4C++_关于函数的返回值问题

    再UE4C 中关于函数的返回值问题
  • android 生成jar包里面包含图片和布局文件

    由于Android应用工程的资源ID R xxx xxx是在编译时生成的 所以 在sdk的jar包中的代码中 不能用R xxx xxx访问资源文件 包含xml布局文件和图片 字符 解决方案 1 图片 把图片文件放入asset中 通过cont
  • Windows使用ssh协议远程连接ubuntu linux子系统

    Windows使用ssh协议远程连接ubuntu linux子系统 一 Windows远程连接ubuntu linux子系统 二 开启ubuntu ssh服务 三 获取ubuntu子系统的ip地址 四 从windows上通过ssh连接到ub
  • 【软件开发】Memcached(理论篇)

    Memcached 理论篇 1 Memcached 简介 Memcached 是一个开源的 支持高性能 高并发的分布式内存缓存系统 由 C 语言编写 总共 2000 多行代码 从软件名称上看 前 3 个字符 Mem 就是内存的意思 而接下来
  • 纯鸿蒙!华为HarmonyOS NEXT不再兼容安卓应用,无法安装Apk文件

    8月7日消息 近日 华为举行2023年华为开发者大会 HDC Together 上 除了发布HarmonyOS 4 全新升级的鸿蒙开发套件外 华为还带来了HarmonyOS NEXT开发者预览版 据了解 HarmonyOS NEXT开发者预
  • 使用样式表自定义Qt小部件(摘自Qt帮助文档)

    盒子模型 边距 边框宽度和填充属性均默认为零 可以使用background image属性指定部件的背景 默认情况下 仅为边框内的区域绘制背景图像 这可以使用background clip属性更改 您可以使用background repea
  • 【面试系列】最小路径和

    题意 原题链接 代码 class Solution public int minPathSum vector
  • 软件测试课堂作业+期末整理【超实用】

    疫情期间在家结课 所用教材 第一本 辅助自学教材 第二本 MOOC上武剑洁老师的配套教材 虽说MOOC是国家精品课 但个人觉得 内容太少 太理论 了 我们大学老师和MOOC出的题目有点不一样 鼠标下滑到最后可见 点击可直接跳转 纯理论 as
  • Qt键盘事件

    ifndef COMPLETELINEEDIT H define COMPLETELINEEDIT H include