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编程----事件 的相关文章

  • Qt Creator 中的按钮是否有隐藏属性?

    Qt Creator 属性托盘中是否有按钮的隐藏属性 我想找到一个 但找不到 我需要禁用一些按钮并隐藏一些按钮 我应该使用属性托盘还是在构造函数中进行 稍后在用户事件中 它们将被启用并显示 有些控件在调色板上具有 可见性 属性 有些则没有
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 如何在C++、Qt、QML、Blackberry 10 Cascades Beta 3 SDK中制作图表/图形(如折线图、条形图、圆形图)等?

    我需要知道如何在 Blackberry 10 Cascades Beta 3 SDK QML Qt C 中制作图表 图表 如果有人可以向我展示一个例子或向我指出一些可以告诉我如何做到这一点的东西 我将不胜感激 您应该查看 QChart js
  • Qml 中的 FileDialog 在发布中不起作用

    我正在与以下项目合作Qt Quick Control 2 当我尝试在调试模式下运行软件时 FileDialog qml 可以完美打开 但是当我将其部署为发布模式时 它无法工作 这是我的代码 import QtQuick 2 4 import
  • 如何删除在设计器模式下创建的插槽?

    我已经创建了按钮cancelButton 然后我创建了函数槽on cancelButton clicked 使用上下文菜单项Go to slot 但是 过了一段时间 我删除了这个按钮 不再需要 并尝试删除该函数 但编译器给出错误undefi
  • 无法将 QMap 传递到 SLOT

    所以 这有效 h public slots void addMenu QString passedName signals void clicked const QString text cpp signalMapper new QSign
  • 为 Visual Studio 2012 编译 Qt 4.8.x

    我应该采取哪些步骤来编译适用于 Visual Studio 2012 的 Qt 版本 4 8 x 我已经仔细遵循了已接受答案中的说明这个问题 https stackoverflow com questions 5601950 how to
  • Qt、PushButton、id 属性?有什么方法可以知道点击了哪个按钮

    void MainWindow addRadioToUI int button cunter 4 while database isEmpty button cunter QPushButton one new QPushButton Pl
  • Qt + win32 + mingw 上的原生 Windows API 链接问题

    我正在尝试使用 mingw 工具集将本机 Windows API 与 Qt 结合使用 部分功能存在链接问题 会发生什么 这是 mingw 名称修改的错误吗 ifdef Q WS WIN HWND hwnd QWidget winId HDC
  • 获取小部件的背景颜色 - 真的

    我无法获取小部件的实际背景颜色 在我的特殊情况下 我在使用 QTabWidget 中的小部件时遇到问题 这是在Windows7上 因此 经典的小部件有一些灰色背景 而选项卡内的小部件通常用白色背景绘制 I tried def bgcolor
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • 访问 java jigsaw 模块中的资源文件[重复]

    这个问题在这里已经有答案了 我正在尝试从项目中的类访问 Eclipse 项目中的文件 我需要将该项目声明为 jigsaw 模块才能从其他项目访问它 但是通过这样做 我无法再访问项目中的 example png 等文件 这是我的项目结构 pr
  • 如何恢复 QSS 属性的默认系统值?

    如果父级之一将其样式表设置为 Qt QSS 会传播给子级color red 它的所有子级都将应用此样式表 如果你明确设置QLabel color red 那么只有 QLabel 子项会受到关注 如果子项设置自己的值 则可以覆盖子项的样式表c
  • Qt GUI 编程设计

    我正在尝试创建一个 GUI 应用程序 主窗口 一个QMainWindow 包含 9 个固定大小的标签以及主窗口的大小 我尝试在没有 Qt GUI Designer 的情况下以编程方式制作它 该项目构建时没有错误 但我看不到主窗口上显示的任何
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们

随机推荐

  • 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的事件如下 键盘事件 按键按下和松开 鼠标事件 鼠标移动 鼠标按键的按下和松开 拖放事件 用鼠标进行拖放 滚轮事件