qt调用了获取键盘按键函数,但是为什么没有获取成功

qt调用了获取键盘按键函数,但是为什么没有获取成功,第1张

正常继承QWidget然后实现void keyPressEvent(QKeyEvent event);是能得到key事件,但是要控件获得焦点的时候才可以

如果你想全局捕获鼠标事件

直接实现重新继承实现QApplication

Qt4实现这个函数virtual bool winEventFilter(MSG msg, long result);

Qt5好像没有上面的函数了,所以用:

KeyNativeEventFilter m_keyFilter = new KeyNativeEventFilter();

installNativeEventFilter(m_keyFilter);

然后实现nativeEventFilter:

bool KeyNativeEventFilter::nativeEventFilter(const QByteArray &eventType, void message, long result)

{

#ifdef WIN32

MSG msg = (MSG )message;

if(WM_HOTKEY == msg->message){

const quint32 keycode = HIWORD(msg->lParam); //键盘按键key值

const quint32 modifiers = LOWORD(msg->lParam);

}

}

#endif

return false;

}

void Widget::keyPressEvent(QKeyEvent event)

{

switch (event->key())

{

case Qt::Key_Return:

focusNextPrevChild(true);

break;}

}

focusNextPrevChild(true);这是选下一个焦点的,返回当前的就在这附近,你帮助里找下,我就帮你找了。

[cpp] view plaincopyprint

  折线图绘制 

  author 周翔 

  2012-8-14 

 

  对外提供接口 

 

   void showData(int data);接受外部的折线数据 

   void setSingleUnitX(const int &value);设置x轴的单位像素 

   void startUpdataTimer(int msecond);定时器更新折线图 

   void stopUpdataTimer();关闭定时器 

 

  /  

  

#ifndef LINEGRAPHWIDGET_H  

#define LINEGRAPHWIDGET_H  

  

#include <QWidget>  

#include <QPen>  

#include <QPainter>  

#include <QResizeEvent>  

//#include <QDebug>  

#include <QTimer>  

  

struct point  

{  

    int x;  

    int y;  

};  

  

class LineGraphWidget : public QWidget  

{  

    Q_OBJECT  

public:  

    //mix和max为折线的y轴的数据范围  

    explicit LineGraphWidget(int min, int max, QWidget parent = 0);  

    void setSingleUnitX(const int &value) {singleUnitX = value;}//设置x轴的一个单位占多少个像素,默认10  

    //支持定时器定时更新  

    void startUpdataTimer(int msecond);  

    void stopUpdataTimer();  

signals:  

    //支持实时更新  

    void newDataCome();//有新数据到来时发出的折线图更新信号  

public slots:  

    / 

      @brief showData 

      @param adress 地址 

      @param _data 数据 

     /  

    void showData(const QString& adress,int _data);//接受来之外部的数据  

    / 

      @brief slt_showData 接受外部数据 

      @param name 设备名 

      @param _data 数据 

     /  

    void slt_showData(ushort name,int _data);  

protected:  

    void paintEvent(QPaintEvent );  

    void resizeEvent(QResizeEvent e);  

private:  

    QString  m_currentNodeAdress;//当前显示的节点的地址  

    ushort m_currentNodeName;//当前节点的设备名  

  

    QList<int> xList;  

    QList<int> yList;  

    int Counter;  

  

  

  

    //窗口的长和宽  

    int widgetX;  

    int widgetY;  

    //折线图的显示范围  

    int rangeMin;  

    int rangeMax;  

    //根据窗口和范围得出的单位长,x轴,y轴  

    int singleUnitX;  

    int singleUnitY;  

  

    //根据窗口得出的多少个单位,x轴,y轴  

    int sumUnitX;  

    int sumUnitY;  

  

    point basePoint;//折线图的原点  

  

    point xAxisEndPoint;//X轴的终点  

  

    point yAxisEndPoint;//Y轴的终点  

  

    QTimer timer;  

  

    void getSumUnitX();  

    void getSingleUnitY();  

  

    void initGraph();  

  

    void flush();//数据传入的节点不是现在的当前的节点的时候,刷新画面,清除所有的值  

  

  

};

你想简单点的话直接用

void setIndexWidget(const QModelIndex &index, QWidget widget);

设置

不然的话你就用委托去实现

QWidget createEditor(QWidget parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;

void setEditorData(QWidget editor, const QModelIndex &index) const;

void setModelData(QWidget editor, QAbstractItemModel model, const QModelIndex &index) const;

void updateEditorGeometry(QWidget editor,

const QStyleOptionViewItem &option,

const QModelIndex &index) const;

focus一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等。 焦点移动的方式有以下几种:按下Tab或Shift+Tab 注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代。点击一个QWidget 建议:只对接受文本输入的Widget启用该功能按下键盘的快捷键 QLabel::setBuddy(), QGroupBox,以及 QTabBar 支持使用鼠标滚轮用户移动焦点 程序将决定被设置focus的Widget的哪一个子Widget获得焦点 注意:如果一个 Widget 已经 grabKeyboard,所有键盘事件将发送到该Widget而不是获得焦点的Widget focusPolicy 一个QWidget获得焦点的方式受 focusPolicy 控制,setFocusPolicy(Qt::StrongFocus);Qt::TabFocus通过Tab键获得焦点Qt::ClickFocus通过被单击获得焦点Qt::StrongFocus可通过上面两种方式获得焦点Qt::NoFocus不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点 keypress和keyrelease 首先,我们要是Widget获得焦点,一般设置focusPolicy。 然后要对按键进行响应,我们只需要直接重载:keyPressEventkeyReleaseEvent 注意:对我们不处理的事件,要调用父类的相应事件处理函数。 如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。 有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。 QKeyEvent 在windows下,与键盘事件有关的有8个消息:对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息 有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。 这些消息在Qt中只体现在QKeyEvent中。对字符,可通过 QKeyEvent::text() 获得其他键,QKeyEvent::key() 获得一个键值实际程序:public: void keyPressEvent(QKeyEvent event);在相应键盘事件之前需要 用一个widget 进行设置 LabelComment->setFocusPolicy(Qt::StrongFocus);void CameraShow::keyPressEvent(QKeyEvent event) { if(event->key()==Qt::Key_Q) { Pause_flag ^= 1; }}

pos()函数就能解决问题,能够返回坐标点QPoint

如果有父窗口的话,你先试试mapToParent(),返回在父窗口中的坐标,然后再

mapToGlobal(),你试试,我现在没空弄这个,如果还不行的话,我再想想

Dialog,是不是Widget的子窗口,要看你构造函数是否指定了如this这样的父窗口,或者setParent()如果是的话,parentWidget ()可以获得QWidget的指针,但是你自己的对象(Widget)需要做一个做个类型的强制转化不知道你说的parentWidget ()没有成功是什么意思,是获得的指针为空吗

以上就是关于qt调用了获取键盘按键函数,但是为什么没有获取成功全部的内容,包括:qt调用了获取键盘按键函数,但是为什么没有获取成功、Qt中如何获取当前焦点控件、求一段用Qt来实现数据库读取并显示成折线图的代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9430379.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存