Qt QML 菜单/目录/工具栏的全面攻略(TabBar、MenuBar、ToolBar、Button定制、Listview、Repeater)
Qt QML 菜单/目录/工具栏的全面攻略
- 1. TabBar的工具栏/目录
- 1.1 演示
- 1.2 关键控件
- 1.3 源码
- 2 MenuBar 菜单
- 2.1 演示
- 2.2 关键控件
- 2.3 源码
- 3 ToolBar 工具栏/目录
- 3.1 演示
- 3.2 关键控件
- 3.3 源码
- 4. 基于Button定制的工具栏/目录
- 4.1 演示
- 4.2 关键控件
- 4.3 源码
- 5. 基于Listview的侧边目录/工具栏
- 5.1 演示
- 5.2 控件
- 5.3 核心源码
- 5.4 源码
- 6. 基于Repeater的目录/工具栏
- 6.1 演示
- 6.2 关键控件
- 6.3 关键源码
- 6.4 源码
- 7. 总结
所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级,和更多的时间吧!
GIT工程文件点击这里: QmlLearningPro
QML其它文章请点击这里: QT QUICK QML 学习笔记
百度云源码在最后,欢迎下载,这里可以跳转
1. TabBar的工具栏/目录
1.1 演示
1.2 关键控件
TabBar 提供了一个tab-based的导航模型,由TabButton来填充内容。
TabButton 与Button相似,都是从AbstractButton继承它的API,一般用在TabBar中。
SwipeView :使用一组页面填充。一次只能看到一个页面。用户可以通过横向滑动在页面之间导航。
PageIndicator :SwipeView本身完全是非可视的。与PageIndicator结合使用后,给用户一个有多个页面的视觉提示。
1.3 源码
如下为TabBar、TabButton放入header中的实例:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.12ApplicationWindow {visible: truewidth: 480height: 360title: qsTr("TabBar工具栏")///--1. ApplicationWindow 中才有 header///--2. QtQuick.Controls 2.0 版本后才有header///--3. TabBar不一定要用在header中header: TabBar {id: tabBarTabButton { text: qsTr("我是目录1") }TabButton { text: qsTr("我是目录2") }TabButton { text: qsTr("我是目录3") }}SwipeView {id: viewcurrentIndex: tabBar.currentIndexanchors.fill: parentonCurrentIndexChanged: {tabBar.currentIndex = currentIndexindicator.currentIndex = currentIndex}//第一页Image {id: firstPagesmooth: truemipmap: trueantialiasing: truefillMode: Image.PreserveAspectFitsourceSize.height: heightsource: "/images/code"}//第二页Image {id: secondPagesmooth: truemipmap: trueantialiasing: truefillMode: Image.PreserveAspectFitsourceSize.height: heightsource: "/images/working"}//第三页Image {id: thirdPagesmooth: truemipmap: trueantialiasing: truefillMode: Image.PreserveAspectFitsourceSize.height: heightsource: "/images/focus"}}PageIndicator {id: indicatorcount: view.countanchors.bottom: view.bottomanchors.horizontalCenter: parent.horizontalCenter}
}
2 MenuBar 菜单
2.1 演示
在上述中增加一个MenuBar菜单条:
2.2 关键控件
MenuBar 菜单栏由下拉菜单组成,通常位于窗口的顶部边缘。
Menu 菜单有两个主要用例,其一为文本菜单; 桌面右键单击后显示的菜单,推荐的打开菜单的方法是调用popup();其二为弹出菜单,例如,在顶部菜单栏中,单击按钮后显示的菜单。
Action 表示一个抽象的用户界面操作,该操作可以具有快捷键,也可以分配给菜单项和工具栏按钮。
MenuItem 与Button相似,都是从AbstractButton继承它的API,一般用在Menu菜单中。
MenuSeparator 是通过用一行线来分隔菜单中的不同项
2.3 源码
在TabBar的导航模型中加入以下代码即可,以下都未绑定触发事件
//不用 "menuBar:" 就不会固定在header的上方menuBar: MenuBar {Menu {title: qsTr("&File")Action { text: qsTr("&New...") }Action { text: qsTr("&Open...") }Action { text: qsTr("&Save") }Action { text: qsTr("Save &As...") }MenuSeparator { }Action { text: qsTr("&Quit") }}Menu {title: qsTr("&Edit")MenuItem {text: "Cut"//快捷键,QtQuick.Controls 2.0后没有了,当然可以用其他方式实现
// shortcut: "Ctrl+X"onTriggered: {}}MenuItem { text: "Copy" }MenuItem { text: "Paste" }}Menu {title: qsTr("&Help")Action { text: qsTr("&About") }}}
3 ToolBar 工具栏/目录
3.1 演示
与TabBar 相似:
3.2 关键控件
ToolBar :常用在页眉或页脚作导航按钮和搜索字段。它通常要与布局,一起使用,如通过创建RowLayout。
ToolButton :继承于Button按钮,但是提供了更适合在工具栏中使用的外观。
RowLayout :能自动调整的横向排列。
3.3 源码
ToolBar 与 TabBar相似,ToolBar 主要没有tabBar.currentIndex属性,需要自定义。在上述代码中作如下修改,其一替换了"header" ,其二为修改控件之间的触发逻辑。(可搜索 “[ToolBar修改]” )
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.12ApplicationWindow {visible: truewidth: 480height: 360title: qsTr("3.ToolBar工具栏")//[ToolBar修改]1: 替换header/* ///--1 TabBar工具栏header: TabBar {id: tabBarTabButton { text: qsTr("我是目录1") }TabButton { text: qsTr("我是目录2") }TabButton { text: qsTr("我是目录3") }}*////--2.ToolBarheader: ToolBar {id: toolBarRowLayout {id: rowLayoutanchors.fill: parentToolButton {text: qsTr("目录0")onClicked: view.currentIndex = 0}ToolButton {text: qsTr("目录1")onClicked: view.currentIndex = 1}ToolButton {text: qsTr("目录2")onClicked: view.currentIndex = 2}}}SwipeView {id: viewanchors.fill: parent//[ToolBar修改]2: 修改控件之间的触发逻辑//currentIndex: tabBar.currentIndexonCurrentIndexChanged: {//tabBar.currentIndex = currentIndexfor (var i=0; i<rowLayout.children.length; i++) {rowLayout.children[i].checked = false}rowLayout.children[currentIndex].checked = trueindicator.currentIndex = currentIndex}//第一页Image {id: firstPagesmooth: truemipmap: trueantialiasing: truefillMode: Image.PreserveAspectFitsourceSize.height: heightsource: "/images/code"}//第二页Image {id: secondPagesmooth: truemipmap: trueantialiasing: truefillMode: Image.PreserveAspectFitsourceSize.height: heightsource: "/images/working"}//第三页Image {id: thirdPagesmooth: truemipmap: trueantialiasing: truefillMode: Image.PreserveAspectFitsourceSize.height: heightsource: "/images/focus"}}PageIndicator {id: indicatorcount: view.countanchors.bottom: view.bottomanchors.horizontalCenter: parent.horizontalCenter}
}
4. 基于Button定制的工具栏/目录
4.1 演示
4.2 关键控件
MyButton :在 “Button” 上的定制,包括背景、内部的文字,图片等。
ColoredImage :彩色图片,之前的文章已经讲过,对普通的 “image” 加一层 “ColorOverlay” 颜色覆盖即可,后续不再讲述。 QML 图像颜色渐变和颜色覆盖
Loader :加载器,动态的加载QML文件,也可以根据需要创建QML,此处为最简单的Loader的加载。
4.3 源码
main.qml:
import QtQuick 2.12
import QtQuick.Window 2.3
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.12ApplicationWindow {visible: truewidth: 480height: 360title: qsTr("4. 定制Button")minimumWidth: 450minimumHeight: 240property int index: 1header: ToolBar {id: tabBarRowLayout {id: rowLayoutanchors.fill: parentspacing: 10//headColoredImage {id: innerImagewidth: 30height: widthsource: "/images/menu"color: "black"}//first ButtonMyButton {id: firstButtontext: qsTr("我是目录1")icon.source: "/images/1"onClicked: {clearAllChecks()checked = trueindex = 1}}//second ButtonMyButton {text: qsTr("我是目录2")icon.source: "/images/2"onClicked: {clearAllChecks()checked = trueindex = 2}}//third ButtonMyButton {text: qsTr("我是目录3")icon.source: "/images/3"onClicked: {clearAllChecks()checked = trueindex = 3}}}}Component.onCompleted: {firstButton.checked = true}function clearAllChecks() {for (var i=0; i<rowLayout.children.length; i++) {if (rowLayout.children[i].toString().startsWith("MyButton"))rowLayout.children[i].checked = false}}//界面的显示的形式有多种多样的,这里不做多说明。如前三个用的SwipeView。Loader {id: firstPageanchors.fill: parentvisible: index==1source: "TestPage1.qml"}Loader {id: secondPageanchors.fill: parentvisible: index==2source: "TestPage2.qml"}TestPage3 {id: thirdPageanchors.fill: parentvisible: index==3}
}
MyButton.qml:
import QtQuick 2.9
import QtQuick.Controls 2.5Button {id: buttonheight: 20leftPadding: 4rightPadding: 4checkable: falseproperty alias labelColor: _label.coloronCheckedChanged: checkable = falsebackground: Rectangle {anchors.fill: parentcolor: button.checked ? "#FFDC35" : Qt.rgba(0,0,0,0)}contentItem: Row { //可修改为Columnspacing: 10anchors.verticalCenter: button.verticalCenterColoredImage {id: innerImagewidth: 20height: widthsource: button.icon.sourcecolor: button.checked ? "#007979" : "black"}Text {id: _labelvisible: text !== ""text: button.textanchors.verticalCenter: parent.verticalCentercolor: button.checked ? "#007979" : "black"font.bold: truefont.pointSize: 15}}
}
ColoredImage.qml 就不贴出了,具体见源码。
5. 基于Listview的侧边目录/工具栏
5.1 演示
5.2 控件
ListView :ListView有一个模型(model)和一个委托(delegate),前者定义要显示的数据,后者定义数据应该如何显示。列表视图中的项目可以水平放置,也可以垂直放置。此处ListView放与左侧且垂直排列。
MouseArea 鼠标区域是一个不可见的项,通常与可见项一起使用,以便为该项提供鼠标处理。
Connections :信号连接器,其它文章也已讲过,此处为连接根目录的listIndex信号。
5.3 核心源码
整体结构是通过ListView来确定的。通过点击事件,触发每一个modelData的listIndex信号,来改变checked的值,来确认是否点击,还可以确保其它model的互斥。主要逻辑如下:
property alias listModel: leftListView.modelsignal listIndex(int idx);ListView{id: leftListView...delegate: listDelegate}Component{id: listDelegateRectangle{property bool checked: false...Connections{target: _leftMenuonListIndex: listItem.checked = (idx===index); }...MouseArea {...onClicked: {listIndex(index)}}}}
5.4 源码
main.qml: (省去部分非关键代码)
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Window 2.12Window {id: rootvisible: truewidth: 480height: 360minimumWidth: 450minimumHeight: 240title: qsTr("ListView菜单/工具栏")property int pageIndex: 0property bool fullMenuShow: falseproperty real menuWidthShort: 40//三个图片界面:Item {id: pageheight: parent.heightanchors.left: parent.leftanchors.leftMargin: 40anchors.right: parent.right//firstPageImage {id: firstPageanchors.fill: parentsmooth: truemipmap: trueantialiasing: truefillMode: Image.PreserveAspectFitsourceSize.height: heightsource: "/images/code"visible: pageIndex == 0}//secondPageImage {id: secondPage...source: "/images/working"visible: pageIndex == 1}//thirdPageImage {id: thirdPage...source: "/images/focus"visible: pageIndex == 2}}//左侧工具栏/目录的外框Rectangle {id: rectMenuwidth: fullMenuShow ? 40*4 : 40height: parent.heightanchors.left: parent.leftanchors.top: parent.topcolor: "gray"MouseArea {anchors.fill: parenthoverEnabled: trueonEntered: fullMenuShow = trueonExited: fullMenuShow = false}
// Behavior on width {// NumberAnimation { duration: 200 }
// }}//左侧工具栏/目录ListviewMenu {id: listViewMenuwidth: rectMenu.widthlistViewIndex: 0;color: "gray"listModel: [{name: qsTr("我是目录1"),iconSource: "/images/1.png",},{name: qsTr("我是目录2"),iconSource: "/images/2.png",},{name: qsTr("我是目录3"),iconSource: "/images/3.png",}]onListIndex: { //使用信号连接器都可以pageIndex = idx;}}
}
ListviewMenu.qml: (省去部分非关键代码)
import QtQuick 2.7
import QtQuick.Controls 1.2
import QtGraphicalEffects 1.0Item {id: _leftMenuvisible: trueheight: leftMunu.height;property alias color: leftMunu.colorproperty alias listViewIndex: leftListView.currentIndex;property alias listModel: leftListView.modelproperty bool bMenuShown: falseproperty real listItemHeight: 30signal listIndex(int idx);Component.onCompleted: {listIndex(0)}Rectangle {id: leftMunuheight: rectHeader.height + leftItem.anchors.margins + leftItem.heightwidth: parent.width///--headerRectangle {id: rectHeaderheight: 35width: parent.widthcolor: "#5D478B" //紫色Row {id: _rowHeader...Image {id: innerImageHeadersource: "/images/menu.png"...}Label {id: innerTextHeader...text: qsTr("目 录")visible: root.fullMenuShow ? true : false}}Image {id: dottedlineHeader...source: "/images/line.png"visible: root.fullMenuShow ? true : false}}///--list viewItem {id: leftItemheight: listItemHeight * leftListView.countwidth: parent.widthanchors.top: rectHeader.bottomListView{id: leftListViewanchors.fill: parentdelegate: listDelegate}}}Component{id: listDelegateRectangle{id: listItemproperty bool checked: falsecolor: _leftMenu.colorwidth: parent.widthheight: listItemHeightConnections{target: _leftMenuonListIndex: listItem.checked = (idx===index);}Row {id: _rowanchors.centerIn: parentheight: parent.height * 0.6width: parent.widthspacing: 6ColoredImage {id: innerImagewidth: menuWidthShortheight: parent.heightsource: modelData.iconSourcecolor: listItem.checked? "yellow" : "white"}Text {id: innerTexttext: modelData.namecolor: listItem.checked? "yellow" : "white" //"#5DB6EA"font.family: "Microsoft Yahei" //友情提醒:商业用途会收费的font.pointSize: 15anchors.verticalCenter: parent.verticalCentervisible: root.fullMenuShow ? true : false}}Image {id: dottedline...fillMode: Image.Stretchsource: "/images/line.png"visible: root.fullMenuShow ? true : false}MouseArea {anchors.fill: parenthoverEnabled: trueonEntered: {root.fullMenuShow = truecolor = "green"}onExited: {root.fullMenuShow = falsecolor = _leftMenu.color}onClicked: {listIndex(index)}}}}
}
6. 基于Repeater的目录/工具栏
6.1 演示
6.2 关键控件
Repeater Repeater类型用于创建大量类似的项。与上文中ListView一样,Repeater有一个模型(model)和一个委托(delegate):前者定义要显示的数据,后者定义数据应该如何显示。
LinearGradient :彩色渐变图片,之前的文章已经讲过,使用它也是对其它知识点的学习。 QML 图像颜色渐变和颜色覆盖
6.3 关键源码
结构与ListView相似,逻辑上也基本一样,多了一个当前项自身的互斥(ListView也可以实现的),配合Column等排列,使用是来更加灵活,其主要结构和逻辑代码如下:
Column { //改为Row RowLoyout等都行...Repeater {...delegate: listDelegate}}Component{id: listDelegateRectangle {property bool checked: falseproperty bool oldChecked: falseConnections{target: menuonGetListIndex: {//idx: click item ---- index: every itemif(idx === index ) {//与前一次互斥事件, 大部分目录都是此逻辑if(idx!==3) {if(!listItem.oldChecked) {listItem.checked = truepageSig(idx)}else {listItem.checked = falsepageSig(9) //关闭此目录(回到主页)/工具}}//可添加:连续点击事件 (工具栏中,需要此逻辑,如放大缩小)else {listItem.checked = truepageSig(idx)}}//所有的子Item互斥else {listItem.checked = false}listItem.oldChecked = listItem.checked}
}...MouseArea {...onClicked: {getListIndex(index)}
}
6.4 源码
main.qml(删除不必要文件)
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Window 2.12//import "qrc:/qml/slider/SlidierMain.qml"Window {visible: truewidth: 480height: 360title: qsTr("Repeater菜单/工具栏")minimumWidth: 450minimumHeight: 240property int pageIndex: 3//三个图片界面 + 主界面:Item {id: pageheight: parent.heightanchors.left: parent.leftanchors.leftMargin: 40anchors.right: parent.right//miantPageText {id: mainPageanchors.centerIn: parenttext: "我是主页"font.pointSize: 30font.bold: truevisible: (pageIndex != 0) || (pageIndex != 1) || (pageIndex != 2)}//firstPageImage {id: firstPageanchors.fill: parentsmooth: truemipmap: trueantialiasing: truefillMode: Image.PreserveAspectFitsourceSize.height: heightsource: "/images/code"visible: pageIndex == 0}//secondPageImage {id: secondPage...source: "/images/working"visible: pageIndex == 1}//thirdPageImage {id: thirdPage...source: "/images/focus"visible: pageIndex == 2}}Rectangle {id: rectMenuwidth: 40height: parent.heightanchors.left: parent.leftanchors.top: parent.topcolor: "gray"border.color: "black"border.width: 2}RepeaterMenu {id: repeaterMenuanchors.fill: rectMenumaxWidth: rectMenu.widthmaxHeight: rectMenu.heightlistMode: [{name: qsTr("我是目录1"),iconSource: "/images/1.png",},{name: qsTr("我是目录2"),iconSource: "/images/2.png",},{name: qsTr("我是目录3"),iconSource: "/images/3.png",}]///--信号连接器Connections {target: repeaterMenuonPageSig : {pageIndex = idx //idx为pageSig信号的输入参数}}}
}
RepeaterMenu.qml(删除不重要代码)
import QtQuick.Layouts 1.2
import QtPositioning 5.2
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtGraphicalEffects 1.2Item {id: menuvisible: trueproperty real maxHeight ///< Maximum height for control, determines whether text is hidden to make control shorterproperty real maxWidthproperty alias listMode: _repeater.modelsignal getListIndex(int idx);signal pageSig(int idx);Column { //改为Row RowLoyout等都行id: rowItem...spacing: 20Repeater {id: _repeateranchors.left: parent.leftdelegate: listDelegate}}Component{id: listDelegateRectangle {id: listItemproperty bool checked: falseproperty bool oldChecked: falseproperty int clickCnt: 0width: innerImage.widthheight: innerImage.heightcolor: Qt.rgba(0,0,0,0) //无色opacity: 0.8 //透明度Connections{target: menuonGetListIndex: {//idx: click item ---- index: every itemif(idx === index ) {//与前一次互斥事件, 大部分目录都是此逻辑if(idx!==3) {if(!listItem.oldChecked) {listItem.checked = truepageSig(idx)}else {listItem.checked = falsepageSig(9) //关闭此目录(回到主页)/工具}}//可添加:连续点击事件 (工具栏中,需要此逻辑,如放大缩小)else {listItem.checked = truepageSig(idx)}}//所有的子Item互斥else {listItem.checked = false}listItem.oldChecked = listItem.checked}}//水平线性渐变LinearGradient{id: innerImage...source: Image {source: modelData.iconSource}gradient: Gradient {...}Rectangle {id: innerRect...color: "green"//Qt.rgba(0,0,0,0)border.color: "black"Text {id: _label...text: modelData.namefont.family: "Microsoft Yahei" //友情提醒:商业用途会收费的font.pointSize: 15color: "blue"}}MouseArea {anchors.fill: innerImagehoverEnabled: trueonEntered: {innerRect.visible = true}onExited: {innerRect.visible = false}onClicked: {getListIndex(index)}}}}
}
7. 总结
本文一共介绍了六种菜单/目录/工具栏,各有优缺点,越是集成高的如TabBar、ToolBar ,就更方便使用,但不灵活,这个时候就可以考虑控件的定制呢。 上述对自己所使用过的目录的总结,也是对使用过的控件的一些归纳,颜色配色还不够舒服,源码稍长,还请见谅~
老板CSDN积分有多,请点击 这里
百度云链接: https://pan.baidu.com/s/1_9YFVOFM7z4BufrYr84Lng 提取码:f92f
GIT 工程文件在这里: QmlLearningPro
QML其它文章请点击这里: QT QUICK QML 学习笔记
本文用到了添加文件组,和别名的管理,可以参考以下:
QT QML 模块化管理(一)——添加工程组(文件组)
QT QML 模块化管理(二)——前缀(Prefix)和别名管理
Qt QML 菜单/目录/工具栏的全面攻略(TabBar、MenuBar、ToolBar、Button定制、Listview、Repeater)相关推荐
- 太吾绘卷第一世攻略_耽美推文-BL-仿佛在攻略一只河豚
目录:<全能攻略游戏>by公子如兰 <无限升级游戏>by暗夜公主 <无限游戏>BY SISIMO <请听游戏的话>by木兮娘 <游戏,在线直播&g ...
- JavaScript运算符完全攻略(史上最全!)
文章目录 JavaScript运算符完全攻略 操作数的个数 操作数的类型 运算符的优先级 运算符的结合性 左值.赋值及其副作用 加法运算 减法运算 乘法运算 除法运算 求余运算 取反运算 递增和递减 ...
- 上海徐汇区:幼儿园入园入学攻略大全(招生计划、地段、电话、户籍政策、随迁子女流程)
上海幼儿园入学 · 文章目录 上海幼儿园教育 · 攻略大全 内容提要 时间表 政府政策.招生计划.地段学区 区教育局.各镇招生咨询电话 信息登记 不同户籍和特殊幼儿入园排序原则 户籍政策 本区户籍(户 ...
- 考研 英语一 大作文-图画作文 (一)----第一段描述图画写作攻略
目录 英语一大作文攻略 (看清楚哦) 第一段如何写? 第一段 第一句话 描述图画 如果是双图的情况: 第一段 第二句话 翻译配图文字 英语一大作文攻略 (看清楚哦) 形式呢没啥好说的 给你一幅漫画 ...
- ACM模式输入输出攻略 | C++篇
文章目录 ACM模式输入输出攻略 | C++篇 1.核心代码模式与ACM模式 2.C++常用的输入输出方法 2.1 输入 (1)cin (2)getline() (3)getchar() 2.2 输出 ...
- rust如何放置篝火_方舟怎么放置篝火 | 手游网游页游攻略大全
发布时间:2016-01-20 方舟:生存进化是一款多人世界开放性生存冒险游戏,让玩家在一个陌生的遍布恐龙的荒岛上,从不着寸缕两手空空到建造房屋,采集装备,驯服恐龙完成生存的任务,游戏怎么玩?看看小编 ...
- 在PyQt中构建 Python 菜单栏、菜单和工具栏
摘要:菜单.工具栏和状态栏是大多数GUI 应用程序的常见且重要的图形组件.您可以使用它们为您的用户提供一种快速访问应用程序选项和功能的方法. 本文分享自华为云社区<Python 和 PyQt:创 ...
- Qt Creator使用补充工具栏
Qt Creator使用补充工具栏 使用补充工具栏 以下方式更改侧边栏的视图 使用补充工具栏 在"编辑"模式下,您可以使用左侧和右侧侧栏将不同的视图组织到项目内容中.其中仅提供与您 ...
- 【MFC】带下拉菜单的工具栏
00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 本实例是对工具栏功能的 ...
最新文章
- 23 种设计模式的通俗解释
- php备份漏洞源码,原创|从 PHP Git 源码的查找导致 PHP 安全漏洞的代码变更
- AI入门:不用任何公式把逐步提升讲清楚
- Spring方法注入 @Lookup注解使用
- 通过mysql show processlist 命令检查mysql锁的方法
- 宿松县事业单位计算机基础知识,计算机基础知识试题(事业单位考试)
- 这次聊聊Promise对象
- 虚拟机命令里面的光标不动了怎么办_Linux Sever简单笔记(第四堂课)之Linux下的文本编辑器vim(vim中常用的操作方式命令) - 我杨晓东太难了...
- 【论文阅读】VulCNN: An Image-inspired Scalable Vulnerability Detection System
- 免费客户旅程(Customer Journey Mapping) 示例总汇
- Phpspreadsheet 中文文档(六)读写文件+读取文件
- android仿微信、QQ等聊天界面,实现点击输入框弹出软键盘、点击其他区域收起软键盘,默认滑动至最低端
- Java编程思想之对象入门
- C语言中getchar()函数的详解
- Java 高并发项目笔记
- 手把手带你快速入门Electron
- 嵌入式的我们需要学习一下ROS吗?
- 《近匠》Worktile王涛:典型MEAN架构下的团队协作工具
- APICloud(柚子科技)是一家劣迹斑斑的公司,It is shit!
- 武汉理工大学计算机考研考纲,2020武汉理工大学计算机考研初试科目、参考书目、招生人数汇总...