QT编程----事件

2023-11-19

QT程序设计进阶-事件

Qt事件 

Qt程序是事件驱动的程序的每个动作都是由幕后某个事件所触发

Qt事件的类型很多常见的qt的事件如下:
键盘事件按键按下和松开.
鼠标事件鼠标移动,鼠标按键的按下和松开.
拖放事件用鼠标进行拖放.
滚轮事件鼠标滚轮滚动.
绘屏事件重绘屏幕的某些部分.
定时事件定时器到时.
焦点事件键盘焦点移动.
进入和离开事件鼠标移入widget之内,或是移出.
移动事件: widget的位置改变.
大小改变事件: widget的大小改变.
显示和隐藏事件: widget显示和隐藏.
窗口事件窗口是否为当前窗口.

还有一些非常见的qt事件,比如socket事件,剪贴板事件,字体改变,布局改变等等.

Qt 的事件和Qt中的signal不一样后者通常用来使用widget, 而前者用来实现 widget. 

比如一个按钮我们使用这个按钮的时候我们只关心他clicked()signal, 至于这个按钮如何接收处理鼠标事件,再发射这个信号,我们是不用关心的但是如果我们要重载一个按钮的时候,我们就要面对event比如我们可以改变它的行为,在鼠标按键按下的时候(mouse press event) 就触发clicked()signal而不是通常在释放的( mouse release event)时候.

事件起源:

基于事件如何被产生与分发,可以把事件分为三类:

1)Spontaneous 事件

2) Posted 事件

3)Sent  事件

1)Spontaneous 事件,由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。

本类事件通常是window system把从系统得到的消息,比如鼠标按键,键盘按键等放入系统的消息队列中. Qt事件循环的时候读取这些事件,转化为QEvent,再依次处理.

2)Posted 事件,由Qt或是应用程序产生,它们被Qt组成队列,再通过事件循环处理。

调用QApplication::postEvent()来产生一个posted类型事件

例如:QWidget::update()函数

当需要重新绘制屏幕时,程序调用update()函数

其实现的原理是new出一个paintEvent,调用 QApplication::postEvent(),将其放入Qt的消息队列中,等待依次被处理

3)Sent  事件由Qt或是应用程序产生,但它们被直接发送到目标对象。

调用QApplication::sendEvent()函数来产生一个sent类型事件

sent 类型事件不会放入队列而是直接被派发和处理, QWidget::repaint()函数用的就是这种方式.

当我们在main()函数的末尾调用QApplication::exec(),程序进入了Qt的事件循环

事件循环如下面所示:

while (!exit_was_called)

{

  while(!posted_event_queue_is_empty)

       {

         process_next_posted_event();

       }

  while(!spontaneous_event_queue_is_empty)

      {

         process_next_spontaneous_event();

      }

  while(!posted_event_queue_is_empty)

      {

        process_next_posted_event();

      }

}

事件循环的处理流程:

1)先处理Qt事件队列中的posted事件,直至为空 

2)再处理系统消息队列中的spontaneous消息,直至为空 

3)在处理系统消息的时候会产生新的Qt posted事件,需要对其再次进行处理 

不通过事件循环

sendEvent的事件派发不通过事件循环。QApplication::sendEvent()是通过调用QApplication::notify(),直接进入了事件的派发和处理环节。

Notify

调用QApplication::sendEvent的时候消息会立即被处理,是同步的实际上QApplication::sendEvent()是通过调用QApplication::notify(), 直接进入了事件的派发和处理环节.所有的事件都最终通过 notify 派发到相应的对象中。

bool QApplication::notify ( QObject * receiver, QEvent * event ) 

它是通过调用receiver->event(event) 来实现的。

目标接受对象的event方法会自动接受notify传来的event事件

event() 会返回一个布尔值,来告诉调用者是否事件被acceptignore,

(true表示accept),从event()返回的布尔值却是用来与QApplication:notify()通讯的

event()函数的处理如下所示:

bool QWidget::event(QEvent *event)

    {

        switch (e->type()) {

        case QEvent::KeyPress:

            keyPressEvent((QKeyEvent *)event);

            if (!((QKeyEvent *)event)->isAccepted())

                return false;

            break;

        case QEvent::KeyRelease:

            keyReleaseEvent((QKeyEvent *)event);

            if (!((QKeyEvent *)event)->isAccepted())

                return false;

            break;

            ...

        }

        return true;

    }

Close事件有点不同,调用QCloseEvent:ignore()取消了关闭操作,而accept()告诉Qt继续执行正常的关闭操作。为了避免混乱,最好是在closeEvent()的新实现中明确地进行accept()ignore()的调用:、

 void MainWindow::closeEvent(QCloseEvent *event)

    {

        if (userReallyWantsToQuit()) {

            event->accept();

        } else {

            event->ignore();

        }

}

例子:keyPressEvent

在空白窗体页面,重载当前窗体类的keyPressEvent方法,实现按键事件的响应。

步骤一:

添加头文件<qevent.h>

form.cpp中填加void   Form1::keyPressEventQKeyEvent *k 

并实现根据不同的键值,执行不同的动作。

步骤二:

添加头文件<qevent.h>

form.h 中为窗体类form1添加 void  keyPressEventQKeyEvent *k )声明;

步骤三:

重新编译工程并运行测试。

void Form1::keyPressEvent( QKeyEvent *k )

{

    if(k->key() == Key_Left)

        {

                qDebug("Left\n");

               ....

        }

    else if(k->key() == Key_Right)

        {

                qDebug("Right\n");

               ...

        }

   else    QWidget::keyPressEvent(k);

}

在具备子控件的复杂窗体中,重载当前窗体类的keyPressEvent方法,实现按键事件的响应。

步骤一:

添加头文件<qevent.h>

form.cpp中填加void   Form1::keyPressEventQKeyEvent *k 

并实现根据不同的键值,执行不同的动作。

步骤二:

添加头文件<qevent.h>

form.h 中为窗体类form1添加 void  keyPressEventQKeyEvent *k )声明;

步骤三:

form.cpp中,消除子控件的焦点策略,使能方向及Tab按键功能。

步骤四:

重新编译工程并运行测试。

例如:

pushButton1 = new QPushButton( this, "pushButton1" );

pushButton1->setGeometry( QRect( 200, 150, 111, 41 ) );

pushButton1->setFocusPolicy(QWidget::NoFocus);

void QWidget::setFocusPolicy ( FocusPolicy ) 

设置这个窗口部件接收键盘焦点的方式。

“focusPolicy”属性保存的是窗口部件接收键盘焦点的策略。 

如果窗口部件通过tab来接收键盘焦点,这个策略就是QWidget::TabFocus

如果窗口部件通过点击来接收键盘焦点,这个策略就是QWidget::ClickFocus

如果窗口部件上述两种方式都使用,是QWidget::StrongFocus

如果它不接收焦点(QWidget的默认值),是QWidget::NoFocus

重载当前窗体类的event方法,实现针对性事件的处理与过滤效果。

步骤一:

form.cpp中填加bool  Form1::eventQEvent *event

并实现根据不同的键值,执行不同的动作。

步骤二:

form.h 中为窗体类form1添加 bool  eventQEvent *event)声明;

步骤三:

重新编译工程并运行测试。

bool Form1::event(QEvent * event)

{

    if (event->type() == QEvent::KeyPress)

    {

        QKeyEvent *keyEvent = (QKeyEvent *) event;

        if (keyEvent->key() == Key_A)

        {

            qDebug("--cut  the  Key_A--\n");

            return true;

        }

    }

    return QWidget::event(event);

}

实验:

1)用鼠标事件实现鼠标放在按钮上,按钮变大。

2)用按键事件实现方向右和方向左键控制2个窗口

3)用信号与槽机制实现鼠标点击nextback实现控制2个窗口

main.cpp:

  1. #include <qapplication.h>   
  2.   
  3. #include "form1.h"   
  4.   
  5. int main( int argc, char ** argv )  
  6.   
  7. {  
  8.   
  9.     QApplication a( argc, argv );  
  10.   
  11.     Form1 w;  
  12.   
  13.     w.show();  
  14.   
  15.     a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );  
  16.   
  17.     return a.exec();  
  18.   
  19. }  


form1.cpp

  1. #include "form1.h"   
  2.   
  3. #include "form2.h"   
  4.   
  5. #include <qvariant.h>   
  6.   
  7. #include <qpushbutton.h>   
  8.   
  9. #include <qlayout.h>   
  10.   
  11. #include <qtooltip.h>   
  12.   
  13. #include <qwhatsthis.h>   
  14.   
  15. #include <qimage.h>   
  16.   
  17. #include <qpixmap.h>   
  18.   
  19. /* 
  20.  
  21.  *  Constructs a Form1 as a child of 'parent', with the 
  22.  
  23.  *  name 'name' and widget flags set to 'f'. 
  24.  
  25.  * 
  26.  
  27.  *  The dialog will by default be modeless, unless you set 'modal' to 
  28.  
  29.  *  TRUE to construct a modal dialog. 
  30.  
  31.  */  
  32.   
  33. Form1::Form1( QWidget* parent, const char* name, bool modal, WFlags fl )  
  34.   
  35.     : QDialog( parent, name, modal, fl )  
  36.   
  37. {  
  38.   
  39.     if ( !name )  
  40.   
  41. setName( "Form1" );  
  42.   
  43.     setMouseTracking (true);  
  44.   
  45.     pushButton1_3_2 = new QPushButton( this"pushButton1_3_2" );  
  46.   
  47.     pushButton1_3_2->setGeometry( QRect( 210, 80, 51, 41 ) );  
  48.   
  49.     pushButton1_3_2->setFocusPolicy(QWidget::NoFocus);  
  50.   
  51.     pushButton1_4_2 = new QPushButton( this"pushButton1_4_2" );  
  52.   
  53.     pushButton1_4_2->setGeometry( QRect( 140, 80, 51, 41 ) );  
  54.   
  55.     pushButton1_4_2->setFocusPolicy(QWidget::NoFocus);  
  56.   
  57.     pushButton1 = new QPushButton( this"pushButton1" );  
  58.   
  59.     pushButton1->setGeometry( QRect( 70, 20, 51, 41 ) );  
  60.   
  61.     pushButton1->setFocusPolicy(QWidget::NoFocus);  
  62.   
  63.     pushButton1_3 = new QPushButton( this"pushButton1_3" );  
  64.   
  65.     pushButton1_3->setGeometry( QRect( 210, 20, 51, 41 ) );  
  66.   
  67.     pushButton1_3->setFocusPolicy(QWidget::NoFocus);  
  68.   
  69.     pushButton1_5 = new QPushButton( this"pushButton1_5" );  
  70.   
  71.     pushButton1_5->setGeometry( QRect( 70, 80, 51, 41 ) );  
  72.   
  73.     pushButton1_5->setFocusPolicy(QWidget::NoFocus);  
  74.   
  75.     pushButton1_4 = new QPushButton( this"pushButton1_4" );  
  76.   
  77.     pushButton1_4->setGeometry( QRect( 140, 20, 51, 41 ) );  
  78.   
  79.     pushButton1_4->setFocusPolicy(QWidget::NoFocus);  
  80.   
  81.     pushButton1_2 = new QPushButton( this"pushButton1_2" );  
  82.   
  83.     pushButton1_2->setGeometry( QRect( 280, 20, 51, 41 ) );  
  84.   
  85.     pushButton1_2->setFocusPolicy(QWidget::NoFocus);  
  86.   
  87.     pushButton1_2_2 = new QPushButton( this"pushButton1_2_2" );  
  88.   
  89.     pushButton1_2_2->setGeometry( QRect( 280, 80, 51, 41 ) );  
  90.   
  91.     pushButton1_2_2->setFocusPolicy(QWidget::NoFocus);  
  92.   
  93.     pushButton9 = new QPushButton( this"pushButton9" );  
  94.   
  95.     pushButton9->setGeometry( QRect( 340, 160, 70, 30 ) );  
  96.   
  97.     pushButton9->setFocusPolicy(QWidget::NoFocus);  
  98.   
  99.     languageChange();  
  100.   
  101.     resize( QSize(434, 204).expandedTo(minimumSizeHint()) );  
  102.   
  103.     clearWState( WState_Polished );  
  104.   
  105.     // signals and slots connections   
  106.   
  107.     connect( pushButton9, SIGNAL( clicked() ), this, SLOT( next() ) );  
  108.   
  109. }  
  110.   
  111. /* 
  112.  
  113.  *  Destroys the object and frees any allocated resources 
  114.  
  115.  */  
  116.   
  117. Form1::~Form1()  
  118.   
  119. {  
  120.   
  121.     // no need to delete child widgets, Qt does it all for us   
  122.   
  123. }  
  124.   
  125. /* 
  126.  
  127.  *  Sets the strings of the subwidgets using the current 
  128.  
  129.  *  language. 
  130.  
  131.  */  
  132.   
  133. void Form1::languageChange()  
  134.   
  135. {  
  136.   
  137.     setCaption( tr( "Form1" ) );  
  138.   
  139.     pushButton1_3_2->setText( tr( "7" ) );  
  140.   
  141.     pushButton1_4_2->setText( tr( "6" ) );  
  142.   
  143.     pushButton1->setText( tr( "1" ) );  
  144.   
  145.     pushButton1_3->setText( tr( "3" ) );  
  146.   
  147.     pushButton1_5->setText( tr( "5" ) );  
  148.   
  149.     pushButton1_4->setText( tr( "2" ) );  
  150.   
  151.     pushButton1_2->setText( tr( "4" ) );  
  152.   
  153.     pushButton1_2_2->setText( tr( "8" ) );  
  154.   
  155.     pushButton9->setText( tr( "next" ) );  
  156.   
  157. }  
  158.   
  159. void Form1::next()  
  160.   
  161. {  
  162.   
  163.     Form2 a;  
  164.   
  165.     a.show();  
  166.   
  167.     close();  
  168.   
  169.     a.exec();  
  170.   
  171. }  
  172.   
  173. void Form1::press_next()  
  174.   
  175. {  
  176.   
  177.     Form2 a;  
  178.   
  179.     a.show();  
  180.   
  181.     close();  
  182.   
  183.     a.exec();  
  184.   
  185. }  
  186.   
  187. void Form1::keyPressEvent ( QKeyEvent * e )  
  188.   
  189. {  
  190.   
  191.     if(e->key()==Key_Right)  
  192.   
  193.         press_next();  
  194.   
  195.     else  
  196.   
  197.         QWidget::keyPressEvent (e);  
  198.   
  199. }  
  200.   
  201. void Form1:: mouseMoveEvent ( QMouseEvent * e )  
  202.   
  203. {  
  204.   
  205.     if(e->x() < 260 && e->x() > 210 && e->y() > 80 && e->y() < 120)  
  206.   
  207.        pushButton1_3_2-> resize(61,51);  
  208.   
  209.     else if(e->x() < 120 && e->x() > 70 && e->y() > 20 && e->y() < 60)  
  210.   
  211.        pushButton1->resize(61,51);  
  212.   
  213.     else if(e->x() < 260 && e->x() > 210 && e->y() > 20 && e->y() < 60)  
  214.   
  215.         pushButton1_3->resize(61,51);  
  216.   
  217.      else  
  218.   
  219.      {  
  220.   
  221.         pushButton1_3_2->resize(51,41);  
  222.   
  223.         pushButton1->resize(51,41);  
  224.   
  225.         pushButton1_3->resize(51,41);  
  226.   
  227.         QWidget::mouseMoveEvent(e);  
  228.   
  229.     }  
  230.   
  231. }  


form2.cpp

  1. #include "form2.h"   
  2.   
  3. #include "form1.h"   
  4.   
  5. #include <qvariant.h>   
  6.   
  7. #include <qpushbutton.h>   
  8.   
  9. #include <qlabel.h>   
  10.   
  11. #include <qlayout.h>   
  12.   
  13. #include <qtooltip.h>   
  14.   
  15. #include <qwhatsthis.h>   
  16.   
  17. #include <qimage.h>   
  18.   
  19. #include <qpixmap.h>   
  20.   
  21. /* 
  22.  
  23.  *  Constructs a Form2 as a child of 'parent', with the 
  24.  
  25.  *  name 'name' and widget flags set to 'f'. 
  26.  
  27.  * 
  28.  
  29.  *  The dialog will by default be modeless, unless you set 'modal' to 
  30.  
  31.  *  TRUE to construct a modal dialog. 
  32.  
  33.  */  
  34.   
  35. Form2::Form2( QWidget* parent, const char* name, bool modal, WFlags fl )  
  36.   
  37.     : QDialog( parent, name, modal, fl )  
  38.   
  39. {  
  40.   
  41.     if ( !name )  
  42.   
  43. setName( "Form2" );  
  44.   
  45.     pushButton19 = new QPushButton( this"pushButton19" );  
  46.   
  47.     pushButton19->setGeometry( QRect( 20, 160, 71, 31 ) );  
  48.   
  49.     textLabel1 = new QLabel( this"textLabel1" );  
  50.   
  51.     textLabel1->setGeometry( QRect( 130, 40, 171, 81 ) );  
  52.   
  53.     languageChange();  
  54.   
  55.     resize( QSize(435, 204).expandedTo(minimumSizeHint()) );  
  56.   
  57.     clearWState( WState_Polished );  
  58.   
  59.     // signals and slots connections   
  60.   
  61.     connect( pushButton19, SIGNAL( clicked() ), this, SLOT( back() ) );  
  62.   
  63. }  
  64.   
  65. /* 
  66.  
  67.  *  Destroys the object and frees any allocated resources 
  68.  
  69.  */  
  70.   
  71. Form2::~Form2()  
  72.   
  73. {  
  74.   
  75.     // no need to delete child widgets, Qt does it all for us   
  76.   
  77. }  
  78.   
  79. /* 
  80.  
  81.  *  Sets the strings of the subwidgets using the current 
  82.  
  83.  *  language. 
  84.  
  85.  */  
  86.   
  87. void Form2::languageChange()  
  88.   
  89. {  
  90.   
  91.     setCaption( tr( "Form2" ) );  
  92.   
  93.     pushButton19->setText( tr( "back" ) );  
  94.   
  95.     pushButton19->setFocusPolicy(QWidget::NoFocus);  
  96.   
  97.     textLabel1->setText( tr( "<h1>hello world</h1>" ) );  
  98.   
  99. }  
  100.   
  101. void Form2::back()  
  102.   
  103. {  
  104.   
  105.     Form1 a;  
  106.   
  107.     a.show();  
  108.   
  109.     close();  
  110.   
  111.     a.exec();  
  112.   
  113. }  
  114.   
  115. ;  
  116.   
  117. void Form2::press_back()  
  118.   
  119. {  
  120.   
  121.     Form1 a;  
  122.   
  123.     a.show();  
  124.   
  125.     close();  
  126.   
  127.     a.exec();  
  128.   
  129. }  
  130.   
  131. void Form2::keyPressEvent ( QKeyEvent * e )  
  132.   
  133. {  
  134.   
  135.     if(e->key()==Key_Left)  
  136.   
  137.          press_back();  
  138.   
  139.      else  
  140.   
  141.          QWidget::keyPressEvent (e);  
  142.   
  143. }  

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

QT编程----事件 的相关文章

  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 访问 JAR 资源

    我有一个jar包含我想要分发的资源 主要是缓存 日志记录等配置 的文件 我对这些资源的相对路径有问题 所以我做了我在另一个 stackoverflow 问题中发现的问题 该问题说这是一种有效的方法 ClassInTheSamePackage
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui
  • QML:无法读取未定义的属性“xxx”

    ApplicationWindow id root property string rootName rootName visible true width 800 height 400 title qsTr WatchFace Maker
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • 在 Qt 服务器上验证用户身份

    我正在尝试使用 C QtTcpSocket 为个人项目 多人国际象棋游戏 实现身份验证系统 我的朋友建议了一种验证用户的方法 但我想问是否有更简单或更好的方法 来自 Python 背景 做这个项目主要是为了加深对 C 的理解 我将发布我朋友
  • QMutex 是否需要是静态的,以便此类实例的其他线程调用知道暂停其操作?

    从多个线程调用以下附加函数 我不希望数据重写附加 因为计数器尚未增加 除了当前使用 Append 的线程之外 这是否会挂起所有进入的线程 或者其他线程会继续运行而不追加数据吗 互斥锁是否需要是 静态 的 或者每个实例都知道要暂停操作吗 如果
  • 第一次信号发射后自动断开

    我正在从文件加载网页 然后替换其中的一些 html self template web page QtWebKit QWebPage self template web page mainFrame load QtCore QUrl tem
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 如何在QT上暂停和重新启动Qtimer

    我有 Ubuntu 我正在使用 IDEQT on C 我将暂停和恢复计时器 例如 void Ordonnancer les taches on pushButton clicked connect dataTimer SIGNAL time
  • 在 C# 中将 Exe 文件作为嵌入式资源运行

    我有一个第 3 方 EXE 我只需要从我的 C 应用程序运行它 我的主要目标是对我的 C 文件中的第 3 方可执行文件进行版权保护 有没有更好的方法来做到这一点 我怎样才能做到这一点 首先将嵌入的可执行文件作为资源文件添加到您现有的资源文件
  • WPF C# 无法找到子文件夹图像资源

    我在程序集中有几个图像 我已在其属性设置中将它们全部标记为资源 为了进行测试 我将图像放在项目的根目录中 Img Source new BitmapImage new Uri pack application MyAssembly comp
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • 有没有一种简单的方法可以在 Eclipse 的 java 项目中使用 XML 资源?

    我想用 java 解析 XML 文件 好吧 很简单 如果我可以使用在同一个 Eclipse 项目的文件夹 我们称之为 资源 文件夹 中创建的 XML 文件 那就太好了 由于版本控制 多个开发平台和总体简单性等问题 拥有此功能而不是访问文件系
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • IDisposable,这真的很重要吗

    很久以前我就开始使用 C C 但我仍然有一个习惯 即确保正确清理所有资源 我始终确保在 IDisposable 类上调用 Dispose 并在包含一次性对象的类中实现 Dispose 模式 然而 在我的环境中 我或多或少是唯一一个这样做的人
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A

随机推荐

  • linux cat命令使用方法,Linux cat命令怎么使用

    作为一个典型的DOS 和WINDOWS用户 让我们一起来学习Linux的一些主要命令 下面跟着学习啦小编来一起了解下Linux cat命令怎么使用吧 Linux cat命令使用方法 cat命令主要用来查看文件内容 创建文件 文件合并 追加文
  • MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据

    昨天连夜赶了一篇文章 讲述了一个被黑客连续攻击服务器三次的普通 搬砖人 一次比一次艰难 一次比一次狠 我给大家看几张图 看看黑客的 佳作 首先创建一个数据库 README FHX 然后创建表 README 插入一条数据 内容如下 内容 以下
  • 学生信息后台管理系统(GUI)

    一 目的 通过制作学生信息后台管理系统熟悉java中JDBC和CUI 图形用户接口 的使用 二 实验工具 1 Eclipse IDE Version 2020 12 4 18 0 2 mysql 3 Navicat Premium 15 数
  • string常见接口的使用(基于c++标准库中的STL)

    前言 string是c 中常见的容器 它是用来管理字符的 它在物理上是可以动态增长的线性表 对于了解它的使用 以及常见的接口使用对于我们日常开发和使用是很有必要的 所以接下来让我们一起来了解一下string常见的接口吧 目录 1 strin
  • 线程池用例

    线程池逻辑类 public class TaskExecutorService private final ExecutorService pool private final ThreadPoolExecutor pool private
  • HTML 5 标签、属性、事件及浏览器兼容性速查表

    HTML 5 可以说是近十年来 Web 标准最巨大的飞跃 和以前的版本不同 HTML 5 并非仅仅用来表示 Web 内容 它的使命是将 Web 带入一个成熟的应用平台 在这个平台上 视频 音频 图象 动画 以及同电脑的交互都被标准化 尽管
  • 相比引流,期货公司更应该借助私域提升留存和转化

    近期 我们和很多期货公司都有过交流和沟通 相较于如何提升产品留存和转化 大家似乎更关注如何引流 我理解大家对流量获取的焦虑 但回归运营的底层逻辑 产品的留存和转化其实更为重要 现如今很多期货公司已陆续借助企业微信搭建私域流量池 虽然了解了市
  • VFloss pytorch

    Loss functions import torch import torch nn as nn from utils general import bbox iou from utils torch utils import is pa
  • Unity3D之Rigidbody

    目录 常用的Rigidbody属性和方法 rigidbody AddForce rigidbody AddTorque rigidbody velocity rigidbody angularVelocity rigidbody Sleep
  • 国家语言对照表

    国家 地区 语言代码 国家 地区 语言代码 简体中文 中国 zh cn 繁体中文 台湾地区 zh tw 繁体中文 香港 zh hk 英语 香港 en hk 英语 美国 en us 英语 英国 en gb 英语 全球 en ww 英语 加拿大
  • Spring源码从入门到精通---@Scope&@Lazy(三)

    上篇文章主要介绍了 ComponentScan的注解 Spring源码从入门到精通 ComponentScan 二 这篇文章主要介绍单例模式 多例模式 懒加载 先上目录结构 这篇文章先创建了beanConfig2文件 1 多例模式 单例模式
  • Compile Options--编译选项

    目的 其主要作用是用于调试跟踪和测试 主要包含 MT TASK MT ZDO FUNC and other MT compile options LCD SUPPORTED LCD SUPPORTED DEBUG BLINK LEDS 且看
  • 【产量预测】BP和GRNN神经网络预测粮食产量【含Matlab源码 1247期】

    一 BP神经网络简介 1 BP神经网络概述 BP Back Propagation 神经网络是1986年由Rumelhart和McCelland为首的科研小组提出 参见他们发表在Nature上的论文 Learning representat
  • 第二章 常用安全工具

    目录 1 Kali系统工具分类 2 Kali Top10工具 1 Kali系统工具分类 信息收集 Information Gathering 主要目的是收集渗透测试目标的基本信息 包括操作系统信息 网络配置信息 应用服务信息等 脆弱性分析
  • Python:读取CSV文件的某几列

    三种读取方式如下 import csv import pandas as pd with open 2 csv r as csvfile reader csv reader csvfile column1 row 1 for row in
  • 【Docker应用篇】GitLab代码私服

    Docker应用篇 GitLab代码私服 什么是GitLab 概述 基于 Docker 安装 GitLab 访问 GitLab 的账户管理 创建用户 设置账户信息 修改用户密码 退出并使用新账户登录 GitLab GitHub 使用 SSH
  • 单例模式的八种写法比较

    单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧 简介 单例模式是一种常
  • Java开发工具

    文章目录 一 Sublime Text 二 IDEA 一 Sublime Text 官网 Sublime Text 说明 文本编辑器 适合初学者练习手写代码 特点 支持多行编辑 二 IDEA
  • Windows powershell添加自定义快捷指令(Linux下对比)

    Windows Powershell 1 创建并修改Windows Powershell 启动执行文件 echo PROFILE 编辑C Users hongyang jia Documents PowerShell Microsoft P
  • QT编程----事件

    QT程序设计进阶 事件 Qt事件 Qt程序是事件驱动的 程序的每个动作都是由幕后某个事件所触发 Qt事件的类型很多 常见的qt的事件如下 键盘事件 按键按下和松开 鼠标事件 鼠标移动 鼠标按键的按下和松开 拖放事件 用鼠标进行拖放 滚轮事件