QKeyEvent

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kongshuai19900505/article/details/82625569

1.简介

QT键盘按键事件实际使用的是重写keyPressEvent的方式实现的,keyPressEvent这是一个虚方法,在代码中重写之后就可以添加自己的响应函数了。

1.1键盘按下事件

void QWidget::keyPressEvent ( QKeyEvent * e )
这个事件处理器可以在子类中被重新实现用来接收这个窗口部件的键盘按下事件。窗口部件最初必须调用setFocusPolicy()来接收焦点并且得到焦点用来接收键盘释放事件。如果你重新实现这个处理器,如果你不能理解这个事件,你就忽略(ignore())这个事件,这是很重要的,这样这个窗口部件的父对象就可以说明它。默认实现是如果用户按下Esc就关闭弹出窗口部件。否则这个事件就被忽略。也可以参考keyReleaseEvent()、QKeyEvent::ignore()、focusPolicy, focusInEvent()、focusOutEvent()、event()和QKeyEvent。在QLineEdit、QTextEdit和QtMultiLineEdit中被重新实现。

1.2按键释放事件

void QWidget::keyReleaseEvent ( QKeyEvent * e )
这个事件处理器可以在子类中被重新实现用来接收这个窗口部件的键盘释放事件。窗口部件最初必须调用setFocusPolicy()来接收焦点并且得到焦点用来接收键盘释放事件。如果你重新实现这个处理器,如果你不能理解这个事件,你就忽略(ignore())这个事件,这是很重要的,这样这个窗口部件的父对象就可以说明它。默认实现就是忽略这个事件。也可以参考keyPressEvent()、QKeyEvent::ignore()、focusPolicy、focusInEvent()、focusOutEvent()、event()和QKeyEvent。

2源码实例

源码文件:

key.pro  
main.cpp  
mainwindow.cpp  
mainwindow.h  
mainwindow.ui

UI界面:

事件响应函数代码:

// 键盘按下事件
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    // 是否按下Ctrl键
    if(event->modifiers() == Qt::ControlModifier)
    {
        // 是否按下M键
        if(event->key() == Qt::Key_M)
            // 窗口最大化
            setWindowState(Qt::WindowMaximized);
    }
    else if(event->key() == Qt::Key_Q)
        ui->label->setText("按下Q键");
    else if(event->key() == Qt::Key_W)
        ui->label->setText("按下W键");
    else if(event->key() == Qt::Key_E)
        ui->label->setText("按下E键");
    else if(event->key() == Qt::Key_R)
        ui->label->setText("按下R键");
    else QWidget::keyPressEvent(event);
}

代码中实现了按键值直接在界面上面显示出来,安装ctrl+M键窗口实现最大化,执行效果:

工程源码可以下载:

https://gitee.com/kslly/QTExample/tree/master/keyEvent

https://download.csdn.net/download/kongshuai19900505/10659344

3附件

按键中的值被都在qnamespace.h的头文件中的enum Key枚举类型内,代码中仅仅验证了少数几个键值,如下表这里面列举了所有的键值

Constant Value Description Constant Value Description
Qt::Key_Escape 0x01000000   Qt::Key_Muhenkan 0x01001122  
Qt::Key_Tab 0x01000001   Qt::Key_Henkan 0x01001123  
Qt::Key_Backtab 0x01000002   Qt::Key_Romaji 0x01001124  
Qt::Key_Backspace 0x01000003   Qt::Key_Hiragana 0x01001125  
Qt::Key_Return 0x01000004   Qt::Key_Katakana 0x01001126  
Qt::Key_Enter 0x01000005 Typically located on the keypad. Qt::Key_Hiragana_Katakana 0x01001127  
Qt::Key_Insert 0x01000006   Qt::Key_Zenkaku 0x01001128  
Qt::Key_Delete 0x01000007   Qt::Key_Hankaku 0x01001129  
Qt::Key_Pause 0x01000008 The Pause/Break key (Note: Not related to pausing media) Qt::Key_Zenkaku_Hankaku 0x0100112a  
Qt::Key_Print 0x01000009   Qt::Key_Touroku 0x0100112b  
Qt::Key_SysReq 0x0100000a   Qt::Key_Massyo 0x0100112c  
Qt::Key_Clear 0x0100000b   Qt::Key_Kana_Lock 0x0100112d  
Qt::Key_Home 0x01000010   Qt::Key_Kana_Shift 0x0100112e  
Qt::Key_End 0x01000011   Qt::Key_Eisu_Shift 0x0100112f  
Qt::Key_Left 0x01000012   Qt::Key_Eisu_toggle 0x01001130  
Qt::Key_Up 0x01000013   Qt::Key_Hangul 0x01001131  
Qt::Key_Right 0x01000014   Qt::Key_Hangul_Start 0x01001132  
Qt::Key_Down 0x01000015   Qt::Key_Hangul_End 0x01001133  
Qt::Key_PageUp 0x01000016   Qt::Key_Hangul_Hanja 0x01001134  
Qt::Key_PageDown 0x01000017   Qt::Key_Hangul_Jamo 0x01001135  
Qt::Key_Shift 0x01000020   Qt::Key_Hangul_Romaja 0x01001136  
Qt::Key_Control 0x01000021 On Mac OS X, this corresponds to the Command keys. Qt::Key_Hangul_Jeonja 0x01001138  
Qt::Key_Meta 0x01000022 On Mac OS X, this corresponds to the Control keys. On Windows keyboards, this key is mapped to the Windows key. Qt::Key_Hangul_Banja 0x01001139  
Qt::Key_Alt 0x01000023   Qt::Key_Hangul_PreHanja 0x0100113a  
Qt::Key_AltGr 0x01001103 On Windows, when the KeyDown event for this key is sent, the Ctrl+Alt modifiers are also set. Qt::Key_Hangul_PostHanja 0x0100113b  
Qt::Key_CapsLock 0x01000024   Qt::Key_Hangul_Special 0x0100113f  
Qt::Key_NumLock 0x01000025   Qt::Key_Dead_Grave 0x01001250  
Qt::Key_ScrollLock 0x01000026   Qt::Key_Dead_Acute 0x01001251  
Qt::Key_F1 0x01000030   Qt::Key_Dead_Circumflex 0x01001252  
Qt::Key_F2 0x01000031   Qt::Key_Dead_Tilde 0x01001253  
Qt::Key_F3 0x01000032   Qt::Key_Dead_Macron 0x01001254  
Qt::Key_F4 0x01000033   Qt::Key_Dead_Breve 0x01001255  
Qt::Key_F5 0x01000034   Qt::Key_Dead_Abovedot 0x01001256  
Qt::Key_F6 0x01000035   Qt::Key_Dead_Diaeresis 0x01001257  
Qt::Key_F7 0x01000036   Qt::Key_Dead_Abovering 0x01001258  
Qt::Key_F8 0x01000037   Qt::Key_Dead_Doubleacute 0x01001259  
Qt::Key_F9 0x01000038   Qt::Key_Dead_Caron 0x0100125a  
Qt::Key_F10 0x01000039   Qt::Key_Dead_Cedilla 0x0100125b  
Qt::Key_F11 0x0100003a   Qt::Key_Dead_Ogonek 0x0100125c  
Qt::Key_F12 0x0100003b   Qt::Key_Dead_Iota 0x0100125d  
Qt::Key_F13 0x0100003c   Qt::Key_Dead_Voiced_Sound 0x0100125e  
Qt::Key_F14 0x0100003d   Qt::Key_Dead_Semivoiced_Sound 0x0100125f  
Qt::Key_F15 0x0100003e   Qt::Key_Dead_Belowdot 0x01001260  
Qt::Key_F16 0x0100003f   Qt::Key_Dead_Hook 0x01001261  
Qt::Key_F17 0x01000040   Qt::Key_Dead_Horn 0x01001262  
Qt::Key_F18 0x01000041   Qt::Key_Back 0x01000061  
Qt::Key_F19 0x01000042   Qt::Key_Forward 0x01000062  
Qt::Key_F20 0x01000043   Qt::Key_Stop 0x01000063  
Qt::Key_F21 0x01000044   Qt::Key_Refresh 0x01000064  
Qt::Key_F22 0x01000045   Qt::Key_VolumeDown 0x01000070  
Qt::Key_F23 0x01000046   Qt::Key_VolumeMute 0x01000071  
Qt::Key_F24 0x01000047   Qt::Key_VolumeUp 0x01000072  
Qt::Key_F25 0x01000048   Qt::Key_BassBoost 0x01000073  
Qt::Key_F26 0x01000049   Qt::Key_BassUp 0x01000074  
Qt::Key_F27 0x0100004a   Qt::Key_BassDown 0x01000075  
Qt::Key_F28 0x0100004b   Qt::Key_TrebleUp 0x01000076  
Qt::Key_F29 0x0100004c   Qt::Key_TrebleDown 0x01000077  
Qt::Key_F30 0x0100004d   Qt::Key_MediaPlay 0x01000080 A key setting the state of the media player to play
Qt::Key_F31 0x0100004e   Qt::Key_MediaStop 0x01000081 A key setting the state of the media player to stop
Qt::Key_F32 0x0100004f   Qt::Key_MediaPrevious 0x01000082  
Qt::Key_F33 0x01000050   Qt::Key_MediaNext 0x01000083  
Qt::Key_F34 0x01000051   Qt::Key_MediaRecord 0x01000084  
Qt::Key_F35 0x01000052   Qt::Key_MediaPause 0x1000085 A key setting the state of the media player to pause (Note: not the pause/break key)
Qt::Key_Super_L 0x01000053   Qt::Key_MediaTogglePlayPause 0x1000086 A key to toggle the play/pause state in the media player (rather than setting an absolute state)
Qt::Key_Super_R 0x01000054   Qt::Key_HomePage 0x01000090  
Qt::Key_Menu 0x01000055   Qt::Key_Favorites 0x01000091  
Qt::Key_Hyper_L 0x01000056   Qt::Key_Search 0x01000092  
Qt::Key_Hyper_R 0x01000057   Qt::Key_Standby 0x01000093  
Qt::Key_Help 0x01000058   Qt::Key_OpenUrl 0x01000094  
Qt::Key_Direction_L 0x01000059   Qt::Key_LaunchMail 0x010000a0  
Qt::Key_Direction_R 0x01000060   Qt::Key_LaunchMedia 0x010000a1  
Qt::Key_Space 0x20   Qt::Key_Launch0 0x010000a2 On X11 this key is mapped to "My Computer" (XF86XK_MyComputer) key for legacy reasons.
Qt::Key_Any Key_Space   Qt::Key_Launch1 0x010000a3 On X11 this key is mapped to "Calculator" (XF86XK_Calculator) key for legacy reasons.
Qt::Key_Exclam 0x21   Qt::Key_Launch2 0x010000a4 On X11 this key is mapped to XF86XK_Launch0 key for legacy reasons.
Qt::Key_QuoteDbl 0x22   Qt::Key_Launch3 0x010000a5 On X11 this key is mapped to XF86XK_Launch1 key for legacy reasons.
Qt::Key_NumberSign 0x23   Qt::Key_Launch4 0x010000a6 On X11 this key is mapped to XF86XK_Launch2 key for legacy reasons.
Qt::Key_Dollar 0x24   Qt::Key_Launch5 0x010000a7 On X11 this key is mapped to XF86XK_Launch3 key for legacy reasons.
Qt::Key_Percent 0x25   Qt::Key_Launch6 0x010000a8 On X11 this key is mapped to XF86XK_Launch4 key for legacy reasons.
Qt::Key_Ampersand 0x26   Qt::Key_Launch7 0x010000a9 On X11 this key is mapped to XF86XK_Launch5 key for legacy reasons.
Qt::Key_Apostrophe 0x27   Qt::Key_Launch8 0x010000aa On X11 this key is mapped to XF86XK_Launch6 key for legacy reasons.
Qt::Key_ParenLeft 0x28   Qt::Key_Launch9 0x010000ab On X11 this key is mapped to XF86XK_Launch7 key for legacy reasons.
Qt::Key_ParenRight 0x29   Qt::Key_LaunchA 0x010000ac On X11 this key is mapped to XF86XK_Launch8 key for legacy reasons.
Qt::Key_Asterisk 0x2a   Qt::Key_LaunchB 0x010000ad On X11 this key is mapped to XF86XK_Launch9 key for legacy reasons.
Qt::Key_Plus 0x2b   Qt::Key_LaunchC 0x010000ae On X11 this key is mapped to XF86XK_LaunchA key for legacy reasons.
Qt::Key_Comma 0x2c   Qt::Key_LaunchD 0x010000af On X11 this key is mapped to XF86XK_LaunchB key for legacy reasons.
Qt::Key_Minus 0x2d   Qt::Key_LaunchE 0x010000b0 On X11 this key is mapped to XF86XK_LaunchC key for legacy reasons.
Qt::Key_Period 0x2e   Qt::Key_LaunchF 0x010000b1 On X11 this key is mapped to XF86XK_LaunchD key for legacy reasons.
Qt::Key_Slash 0x2f   Qt::Key_LaunchG 0x0100010e On X11 this key is mapped to XF86XK_LaunchE key for legacy reasons.
Qt::Key_0 0x30   Qt::Key_LaunchH 0x0100010f On X11 this key is mapped to XF86XK_LaunchF key for legacy reasons.
Qt::Key_1 0x31   Qt::Key_MonBrightnessUp 0x010000b2  
Qt::Key_2 0x32   Qt::Key_MonBrightnessDown 0x010000b3  
Qt::Key_3 0x33   Qt::Key_KeyboardLightOnOff 0x010000b4  
Qt::Key_4 0x34   Qt::Key_KeyboardBrightnessUp 0x010000b5  
Qt::Key_5 0x35   Qt::Key_KeyboardBrightnessDown 0x010000b6  
Qt::Key_6 0x36   Qt::Key_PowerOff 0x010000b7  
Qt::Key_7 0x37   Qt::Key_WakeUp 0x010000b8  
Qt::Key_8 0x38   Qt::Key_Eject 0x010000b9  
Qt::Key_9 0x39   Qt::Key_ScreenSaver 0x010000ba  
Qt::Key_Colon 0x3a   Qt::Key_WWW 0x010000bb  
Qt::Key_Semicolon 0x3b   Qt::Key_Memo 0x010000bc  
Qt::Key_Less 0x3c   Qt::Key_LightBulb 0x010000bd  
Qt::Key_Equal 0x3d   Qt::Key_Shop 0x010000be  
Qt::Key_Greater 0x3e   Qt::Key_History 0x010000bf  
Qt::Key_Question 0x3f   Qt::Key_AddFavorite 0x010000c0  
Qt::Key_At 0x40   Qt::Key_HotLinks 0x010000c1  
Qt::Key_A 0x41   Qt::Key_BrightnessAdjust 0x010000c2  
Qt::Key_B 0x42   Qt::Key_Finance 0x010000c3  
Qt::Key_C 0x43   Qt::Key_Community 0x010000c4  
Qt::Key_D 0x44   Qt::Key_AudioRewind 0x010000c5  
Qt::Key_E 0x45   Qt::Key_BackForward 0x010000c6  
Qt::Key_F 0x46   Qt::Key_ApplicationLeft 0x010000c7  
Qt::Key_G 0x47   Qt::Key_ApplicationRight 0x010000c8  
Qt::Key_H 0x48   Qt::Key_Book 0x010000c9  
Qt::Key_I 0x49   Qt::Key_CD 0x010000ca  
Qt::Key_J 0x4a   Qt::Key_Calculator 0x010000cb On X11 this key is not mapped for legacy reasons. Use Qt::Key_Launch1 instead.
Qt::Key_K 0x4b   Qt::Key_ToDoList 0x010000cc  
Qt::Key_L 0x4c   Qt::Key_ClearGrab 0x010000cd  
Qt::Key_M 0x4d   Qt::Key_Close 0x010000ce  
Qt::Key_N 0x4e   Qt::Key_Copy 0x010000cf  
Qt::Key_O 0x4f   Qt::Key_Cut 0x010000d0  
Qt::Key_P 0x50   Qt::Key_Display 0x010000d1  
Qt::Key_Q 0x51   Qt::Key_DOS 0x010000d2  
Qt::Key_R 0x52   Qt::Key_Documents 0x010000d3  
Qt::Key_S 0x53   Qt::Key_Excel 0x010000d4  
Qt::Key_T 0x54   Qt::Key_Explorer 0x010000d5  
Qt::Key_U 0x55   Qt::Key_Game 0x010000d6  
Qt::Key_V 0x56   Qt::Key_Go 0x010000d7  
Qt::Key_W 0x57   Qt::Key_iTouch 0x010000d8  
Qt::Key_X 0x58   Qt::Key_LogOff 0x010000d9  
Qt::Key_Y 0x59   Qt::Key_Market 0x010000da  
Qt::Key_Z 0x5a   Qt::Key_Meeting 0x010000db  
Qt::Key_BracketLeft 0x5b   Qt::Key_MenuKB 0x010000dc  
Qt::Key_Backslash 0x5c   Qt::Key_MenuPB 0x010000dd  
Qt::Key_BracketRight 0x5d   Qt::Key_MySites 0x010000de  
Qt::Key_AsciiCircum 0x5e   Qt::Key_News 0x010000df  
Qt::Key_Underscore 0x5f   Qt::Key_OfficeHome 0x010000e0  
Qt::Key_QuoteLeft 0x60   Qt::Key_Option 0x010000e1  
Qt::Key_BraceLeft 0x7b   Qt::Key_Paste 0x010000e2  
Qt::Key_Bar 0x7c   Qt::Key_Phone 0x010000e3  
Qt::Key_BraceRight 0x7d   Qt::Key_Calendar 0x010000e4  
Qt::Key_AsciiTilde 0x7e   Qt::Key_Reply 0x010000e5  
Qt::Key_nobreakspace 0x0a0   Qt::Key_Reload 0x010000e6  
Qt::Key_exclamdown 0x0a1   Qt::Key_RotateWindows 0x010000e7  
Qt::Key_cent 0x0a2   Qt::Key_RotationPB 0x010000e8  
Qt::Key_sterling 0x0a3   Qt::Key_RotationKB 0x010000e9  
Qt::Key_currency 0x0a4   Qt::Key_Save 0x010000ea  
Qt::Key_yen 0x0a5   Qt::Key_Send 0x010000eb  
Qt::Key_brokenbar 0x0a6   Qt::Key_Spell 0x010000ec  
Qt::Key_section 0x0a7   Qt::Key_SplitScreen 0x010000ed  
Qt::Key_diaeresis 0x0a8   Qt::Key_Support 0x010000ee  
Qt::Key_copyright 0x0a9   Qt::Key_TaskPane 0x010000ef  
Qt::Key_ordfeminine 0x0aa   Qt::Key_Terminal 0x010000f0  
Qt::Key_guillemotleft 0x0ab   Qt::Key_Tools 0x010000f1  
Qt::Key_notsign 0x0ac   Qt::Key_Travel 0x010000f2  
Qt::Key_hyphen 0x0ad   Qt::Key_Video 0x010000f3  
Qt::Key_registered 0x0ae   Qt::Key_Word 0x010000f4  
Qt::Key_macron 0x0af   Qt::Key_Xfer 0x010000f5  
Qt::Key_degree 0x0b0   Qt::Key_ZoomIn 0x010000f6  
Qt::Key_plusminus 0x0b1   Qt::Key_ZoomOut 0x010000f7  
Qt::Key_twosuperior 0x0b2   Qt::Key_Away 0x010000f8  
Qt::Key_threesuperior 0x0b3   Qt::Key_Messenger 0x010000f9  
Qt::Key_acute 0x0b4   Qt::Key_WebCam 0x010000fa  
Qt::Key_mu 0x0b5   Qt::Key_MailForward 0x010000fb  
Qt::Key_paragraph 0x0b6   Qt::Key_Pictures 0x010000fc  
Qt::Key_periodcentered 0x0b7   Qt::Key_Music 0x010000fd  
Qt::Key_cedilla 0x0b8   Qt::Key_Battery 0x010000fe  
Qt::Key_onesuperior 0x0b9   Qt::Key_Bluetooth 0x010000ff  
Qt::Key_masculine 0x0ba   Qt::Key_WLAN 0x01000100  
Qt::Key_guillemotright 0x0bb   Qt::Key_UWB 0x01000101  
Qt::Key_onequarter 0x0bc   Qt::Key_AudioForward 0x01000102  
Qt::Key_onehalf 0x0bd   Qt::Key_AudioRepeat 0x01000103  
Qt::Key_threequarters 0x0be   Qt::Key_AudioRandomPlay 0x01000104  
Qt::Key_questiondown 0x0bf   Qt::Key_Subtitle 0x01000105  
Qt::Key_Agrave 0x0c0   Qt::Key_AudioCycleTrack 0x01000106  
Qt::Key_Aacute 0x0c1   Qt::Key_Time 0x01000107  
Qt::Key_Acircumflex 0x0c2   Qt::Key_Hibernate 0x01000108  
Qt::Key_Atilde 0x0c3   Qt::Key_View 0x01000109  
Qt::Key_Adiaeresis 0x0c4   Qt::Key_TopMenu 0x0100010a  
Qt::Key_Aring 0x0c5   Qt::Key_PowerDown 0x0100010b  
Qt::Key_AE 0x0c6   Qt::Key_Suspend 0x0100010c  
Qt::Key_Ccedilla 0x0c7   Qt::Key_ContrastAdjust 0x0100010d  
Qt::Key_Egrave 0x0c8   Qt::Key_TouchpadToggle 0x01000110  
Qt::Key_Eacute 0x0c9   Qt::Key_TouchpadOn 0x01000111  
Qt::Key_Ecircumflex 0x0ca   Qt::Key_TouchpadOff 0x01000112  
Qt::Key_Ediaeresis 0x0cb   Qt::Key_MicMute 0x01000113  
Qt::Key_Igrave 0x0cc   Qt::Key_Red 0x01000114  
Qt::Key_Iacute 0x0cd   Qt::Key_Green 0x01000115  
Qt::Key_Icircumflex 0x0ce   Qt::Key_Yellow 0x01000116  
Qt::Key_Idiaeresis 0x0cf   Qt::Key_Blue 0x01000117  
Qt::Key_ETH 0x0d0   Qt::Key_ChannelUp 0x01000118  
Qt::Key_Ntilde 0x0d1   Qt::Key_ChannelDown 0x01000119  
Qt::Key_Ograve 0x0d2   Qt::Key_MediaLast 0x0100ffff  
Qt::Key_Oacute 0x0d3   Qt::Key_unknown 0x01ffffff  
Qt::Key_Ocircumflex 0x0d4   Qt::Key_Call 0x01100004 A key to answer or initiate a call (see Qt::Key_ToggleCallHangup for a key to toggle current call state)
Qt::Key_Otilde 0x0d5   Qt::Key_Camera 0x01100020 A key to activate the camera shutter
Qt::Key_Odiaeresis 0x0d6   Qt::Key_CameraFocus 0x01100021 A key to focus the camera
Qt::Key_multiply 0x0d7   Qt::Key_Context1 0x01100000  
Qt::Key_Ooblique 0x0d8   Qt::Key_Context2 0x01100001  
Qt::Key_Ugrave 0x0d9   Qt::Key_Context3 0x01100002  
Qt::Key_Uacute 0x0da   Qt::Key_Context4 0x01100003  
Qt::Key_Ucircumflex 0x0db   Qt::Key_Flip 0x01100006  
Qt::Key_Udiaeresis 0x0dc   Qt::Key_Hangup 0x01100005 A key to end an ongoing call (see Qt::Key_ToggleCallHangup for a key to toggle current call state)
Qt::Key_Yacute 0x0dd   Qt::Key_No 0x01010002  
Qt::Key_THORN 0x0de   Qt::Key_Select 0x01010000  
Qt::Key_ssharp 0x0df   Qt::Key_Yes 0x01010001  
Qt::Key_division 0x0f7   Qt::Key_ToggleCallHangup 0x01100007 A key to toggle the current call state (ie. either answer, or hangup) depending on current call state
Qt::Key_ydiaeresis 0x0ff   Qt::Key_VoiceDial 0x01100008  
Qt::Key_Multi_key 0x01001120   Qt::Key_LastNumberRedial 0x01100009  
Qt::Key_Codeinput 0x01001137   Qt::Key_Execute 0x01020003  
Qt::Key_SingleCandidate 0x0100113c   Qt::Key_Printer 0x01020002  
Qt::Key_MultipleCandidate 0x0100113d   Qt::Key_Play 0x01020005  
Qt::Key_PreviousCandidate 0x0100113e   Qt::Key_Sleep 0x01020004  
Qt::Key_Mode_switch 0x0100117e   Qt::Key_Zoom 0x01020006  
Qt::Key_Kanji 0x01001121   Qt::Key_Cancel 0x01020001  

猜你喜欢

转载自blog.csdn.net/kongshuai19900505/article/details/82625569