当前位置: 首页 > news >正文

做网站需要什么资金河北省建设信息中心网站

做网站需要什么资金,河北省建设信息中心网站,51CTO学院个人网站开发视频,wordpress 仿站一个图形化界面当然需要有各种各样的控件#xff0c;QT也不例外#xff0c;在QT designer中就有提供各种各样的控件#xff0c;用以开发图形化界面。 而想使用好一个QT控件#xff0c;就需要了解这些控件。 QWidget 在QT中#xff0c;所有控件都继承自 QWidget 类…一个图形化界面当然需要有各种各样的控件QT也不例外在QT designer中就有提供各种各样的控件用以开发图形化界面。 而想使用好一个QT控件就需要了解这些控件。 QWidget  在QT中所有控件都继承自 QWidget 类如按钮、输入框、文本框之类的控件都继承自该类。 换言之该类包含所有控件通用的部分。 在QT desigener 中我们每使用一个控件都可以在右下角看到对应的 QWidget 属性。 这些核心属性我们可以在右下角的表中修改也可以通过函数修改。  接下来我们了解一些 QWidget 类的核心属性。 enabled属性 API 名称说明isEnabled()获取控件的可用状态setEnabled()设置控件是否可用true表示可用false表示禁用 给一个按钮设置一个槽函数将控件状态设置为不可用。 发现点击了一次后按钮就不可用了。  在 QT Designer 界面我们能够看到一个控件其有两个父类——QObject 和 QWidget。 QObject 是 QWidget 的父类它最主要的属性就是 objectName在QT中objectName是QT辨识对象的唯一标识互相之间不可重复在QT Designer 中可以通过objectName获取一个对象。 这是因为 designer 的 ui 文件本来是xml格式的通过 .qmake 编译器将 xml 文件转换成 C的 .h 头文件build文件中由此构成一个 ui_widget 类。这样每个控件的 objectName 就会变成 ui_widget 类的属性成员因此 UI::Widget *ui 这个成员就能够通过 objectName 访问对应的控件对象了。  geometry属性 这个属性包含四个属性的统称。 x 横坐标y 纵坐标width 宽度height 高度 其中x和y坐标是指一个控件左上角相对于该控件的父元素的左上角的距离。 比如我们设置一个按钮其坐标应该是这样的。 其中由于QT都是左手坐标系因此使用的时候都需要从左上角开始计算。  而我们可以通过API来设置属性。  API说明geometry获取控件的位置和尺寸返回一个QRect对象包含 x、y、height、width四个属性 setGeometry(QRect) setGeometry(int x,int y,int width,int height) 设置属性有两种方式直接通过 QRect 对象设置或者直接通过传递 int 变量设置。 接着我们示例一下首先是直接通过QRect变换按钮位置。  我们发现 x 确实修改了但是按钮的长和宽都改变了而如果不想修改按钮的长宽就需要采用其他方案。 发现确实是整个都移动了。  frame的影响 QWidget 是一个窗口包括标题栏、最小化、最大化、关闭按钮等因此计算尺寸和坐标时有两种算法包括 frame 的和不包括 frame 的。  API说明x() 获取横坐标 包括 window frame y() 获取纵坐标 包括 window frame pos() 返回 QPoint 对象包括 x(),y(),setX(),setY()等方法 包括 window frame frameSize() 返回QSize 对象包括 width(),height().setWidth(),setHeight()等方法 包括window frame freamGeometry() 返回QRect对象这个包括 x,y,width,height 等属性和修改方法 包括windowframe -—————————————以下函数不包括window frame—————width()获取宽度height()获取高度size()获取QSize对象、包含 width(),height()以及setWidth(),setHeight() 方法rect()获取QRect对象包含 xywidthheight属性以及设置函数geometry()获取QRect同上setGeometry()设置 QRect。 说了这么多frame是什么呢实际上frame就是窗口的标题框的位置。 包含 frame 获取的坐标就是从标题框左上角开始计算而不包含则是从下图的蓝色位置开始计算。 我们可以通过实验看一下framegeometry和 geometry 有什么区别。 一个是在构造函数时打印一个是在按钮被按下去时打印。 发现构造函数中两个打印的位置都一样但是函数里的不同。 这是因为构造时 Widget 还未挂在对象树上因此不具备 Window frame不过后槽函数运行时就以及有frame了因此不同。 WindowTitle属性 API说明windowTitle()获取控件的窗口标题setWindowTitle(const QString title)设置控件的标题 通过这两个API可以设置标题。 WindowIcon属性 API说明windowIcon()获取控件的窗口图标返回QIcon对象setWindowIcon(const QIcon icon)设置窗口的图标 首先我在d盘放入一张图片。 然后在代码中打开这张图片。 注意这里打开文件的方式可以用 \ 或者 /不过 \ 需要转义来使用 即 \\ 的格式因此使用的 / 。  发现图标确实改变了。  同时任务栏的图标也改变了。 不过这种方式来修改图标的方式不是很好因为这是绝对路径无法保证所有用户都有一样的路径。 而我们可以使用相对路径来修改图标。 绝对路径以盘符开头(windows)或 / 开头(linux) 的路径相对路径以 . (标识当前路径) 或以 .. (表示上级路径)使用相对路径需要明确是当前工作目录 一个QT程序它的工作目录是变化的如在QT Creator 运行的项目其工作目录是项目的构建目录。 构建目录就是和QT项目并列的用来存放临时文件和 exe 文件的目录可以通过 Explorer 显示来找到QT项目然后找到构建目录。 我们也可以在项目代码中直接获取工作目录。 如果我们将图片放在构建目录中那么就能够保证每个用户都能成功换上图标。 但是有个问题因为构建目录很容易被删除一旦清理项目那么图片也就没了。 对于这种问题QT 提供了 qrc 机制来方便的管理项目依赖的静态资源。 qrc机制一种XML格式的配置文件用XML记录硬盘上的文件和对应的资源名应用程序通过资源名称访问这些资源。 通过将一些资源文件添加到项目中来管理一般这些文件都位于qrc文件所在目录的同级目录或者子目录下 QT通过将这些文件转化了二进制数据写到 cpp 代码中编译到 exe 文件中使得资源与路径无关。 想要使用 qrc 来使资源和路径无关就需要先创建一个qrc文件。 点击文件- 新建文件或类-选择 QT 和 QT Resource File。这样就创建了一个 qrc 文件。 然后再通过给 qrc 文件添加前缀然后添加文件即可。 添加后可以看到左边项目多出了一个文件。  然后就可以直接设置图标了。 其中使用 qrc 机制来获取资源有它自己的规则。 使用 : 开头表示从 qrc 中读取资源/new/prefix1: 表示资源所在路径不可有中文或者特殊符号test.jpg : 表示资源的名称 qrc 机制实际上就是将 test.jpg 这个文件的每个字节记录下来然后编译进exe文件中这样文件就和资源路径不相关了。 优点做到了资源路径和资源无关不会丢失文件 缺点当资源很大时生成的exe文件也会很大消耗的内存编译的时间也会增加 WindowOpacity属性 API说明 WindowOpacity() 获取控件的不透明数值返回 float 。 透明度在 0.0 - 1.0 之间0.0 表示完全透明1.0表示完全不透明。 setWindowOpacity(float i)设置控件的不透明数值 通过这个函数我们能够获取 Window 的透明度并且对透明度进行修改。 设置两个按钮。  然后设置槽函数分别会对MainWindow的透明度进行加和减。 我们能够看到确实修改了窗口的透明度。 而 qDebug 的输出发现结果并不一定是精确的有一定的精度缺失。  cursor属性 API说明cursor() 获取当前 widget 的cursor属性返回QCursor对象 当鼠标悬停在该 widget 上时就会显示对应的形状 setCursor(const QCursor cursor)设置该光标的形状只有鼠标停留在widget上才有效QGuiApplication::setOverrideCursor(cosnt QCursor cursor) 设置全局的光标形状。 整个程序的光标都会改变覆盖setCursor的内容 新添加一个按钮该按钮可以修改 Cursor 属性。  该控件的槽函数会给全局的控件都改变图标。  按下按钮后发现所有控件的图标都变成了 WaitCursor不管是窗口的还是其他按钮的。  而 Cursor 属性有很多通过 ctrl 左键点击WaitCursor能够看到很多类型。 而且这个图标我们也可以自定义。 发现图标确实被修改成自定义的图片了。  font 属性 API说明font()获取QWidget对象的信息返回QFont对象setFont(const QFont font)设置该控件的字体信息 一个字体也是具有各种各样的属性如字体粗体斜线等... API说明family字体家族有宋体楷体黑体等pointSize字体大小weight字体粗细字体粗细程度从 [0,99]不等数值越大越粗bold是否加粗true 表示是false表示否italic是否倾斜underline是否有下划线strikeOut是否带有删除线 对于字体我们可以在左下角的黄色框里面进行修改或者通过代码修改。  可以通过代码修改  toolTip属性 API说明setToolTip(Qstring str) 设置toolTip 当鼠标悬停时就会有提示说明 setToolTipDuration(int) 设置toolTip提示的时间单位是ms 时间到后自动消失 通过两个API可以设置按钮的提示信息以及提示信息存在的时间。 focusPolicy属性 通过设置某些控件能否通过焦点获取如通过鼠标点击或者 Tab 键选中。 焦点能否选中这个元素 比如星际中就需要选中单位然后才能命令单位进行任务。 输入框复选框之类的都需要这个属性。 、 API说明focusPolicy() 获取该 Widget 的 focusPolicy 返回 Qt::FocusPolicy setFocusPolicy(Qt::FocusPolicy) 设置widget的 focusPlicy 比如我们添加一个新控件--- lineEdit 即单行输入框。 我们可以通过代码的形式来设置它的 FocusPolicy 属性。 而 FocusPolicy 一共有五个属性分别对应不同的表现。 Qt::NoFocus 不接受焦点即无法通过鼠标或者 Tab 键来选中控件 Qt::TabFocus : 只能通过 Tab 键选中无法通过鼠标选中 Qt::ClickFocus : 只能通过鼠标选中无法通过 Tab 键选中 Qt::StrongFocus 可以通过Tab 键和鼠标选中也是控件的默认属性 Qt::WheelFocus : 类似 StrongFocus不过还可以通过鼠标滚轮选中比较少用。 当然我们也能在 Qt Designer 中修改这个值。  styleSheet属性 可以通过 CSS 设置 widget 的样式。 当然CSS是网页前端的技术并不是Qt的技术不过 Qt 和 CSS 也有很多类似之处因此也引入了 CSS 的技术但是有没有全部引入可以说引入了又没完全引入。 比如这里有一个文本框可以通过右键设置然后编辑样式表这样就可以输出 CSS 语言来控制文本框的样式了。 在这里使用的格式也是和 CSS 一样用键值对设置样式。 键值之间用 : 隔开 不同的键值对之间通过 ; 隔开。 不过 Qt 不能检测哪些不支持 而我们通过 CSS 修改的样式就是 styleSheet 属性。 当然我们也能通过代码修改 styleSheet 属性。 API说明setStyleSheet(QString str)将 widget 的样式修改成 str 中的样式 比如我们设置两个按钮。  它们的槽函数会分别修改窗口的背景颜色字体颜色。 #fff 纯白色 #333 : 深色不是纯黑 #000 纯黑色 能够看到确实进行了转化。  在电脑中的所有颜色都是通过数字表示的可以通过网站查看。在线调色板调色板工具—在线工具 (sojson.com)  按钮类控件 PushButton控件 QPushButton 就是一个按钮它继承自 QAbstractButton 类。 QAbstractButton 是所有按钮的父类。  我们也可以在 Qt Designer 中看到它的继承关系。 在 QAbstractButton中有些属性和 QPushButton 是高度相关的。 属性说明text按钮文本icon按钮图标iconSize图标大小shortCut按钮对应的快捷键autoRepeat 按钮是否能够重复触发。 true 表示能够重复触发false表示不能 相当于连续点击这个按钮。 autoRepetDelay重复触发的延时时间按住按钮之后多久开始重复触发autoRepeatInterval重复触发的周期 由于 QWidget 算是所有控件的父类因此在上面说的所有属性QAbustractButton 中也有。 并且 Qt 的接口设计十分清晰比如 shorCut 属性想设置快捷键的 API 就是 setShortcut. 可以在使用的时候自己多试试。 我们设置五个按钮并且清空文本。 然后通过 QIcon 设置按钮图标。  然后分别个下面的四个按钮设置槽函数。  这样我们就能通过键盘来控制按钮并且还能够设置按钮的图标。  Radio Button控件 Radio Button 是一个单选按钮让我们在多个选项中选一个。 当然QAbustractButton 中的所有属性它也有。 而 QAbustractButton 和 Radio Button 控件相关的属性有。 属性说明checkable是否能选中checked是否已经选中checkable是checked的前提条件autoExclusive 是否排他 选中一个按钮是否会取消其他按钮的选中 一般Radio Button 默认排他 我们设置一个文本框和三个 Radio Button 。 设置三个槽函数。  可以看到选中一个按钮其他的按钮就没有选中。 而如果我们设定某一个按钮是不可选中时会发现该按钮依旧可以点击槽函数会运行但是不会被选中。 setCheckable 为 false 而如果是设置某个按钮 Enable 为false则该按钮直接不可选中。 Ra 按钮的四种触发模式 在 Qt 中按钮一共有四个触发模式。 clicked 鼠标点击并且释放触发 pressed 鼠标点击触发 released 鼠标释放触发 toggled   checked 属性更换触发 一般 Radio Button 是 toggled 模式触发。 按钮分组 Radio Button 是默认排他的但是有时候我们需要排他性但是又不完全排他的性质。 比如肯德基点套餐汉堡可以牛肉堡鸡肉堡二选一饮料雪碧可乐二选一之类的。 我们总不可能选了牛肉堡就不能选可乐了。 这就需要按钮分组了。 我们首选搞四个按钮设置好名字。 然后通过 QButtonGroup 进行分组将牛肉堡和鸡肉堡放一组可乐和雪碧放一组。  可以看到选择汉堡的时候不会影响到饮品的选择。 CheckBox控件 上面了解了 Radio Button是一个单选的控件而CheckBox控件则是一个多选控件。 该控件的属性和 RadioButton类似API也类似因此不再阐述。 直接了解如何使用。 在 Qt Designer 选择三个 CheckBox并且设置好名称。 然后通过 connect 绑定对应的槽函数和信号。 对于复选框来说每次选中或者取消选择都会发送一个 stateChanged 信号如果想让复选框状态改变时触发某一个行为可以绑定这个信号。 当然我们也可以通过 isChecked() 函数来判断是否变换了。  可以看到选中和取消选中槽函数都被触发了。 我们新增几个控件然后给 PushButton 按钮添加槽函数。 当点击确认按钮就修改 label 的文本。  提交后发现确实修改了。  显示类控件 Label控件 Label 是一个标签可以显示图片或者文本。 有以下核心属性。 属性说明textLabel 中的文本textFormat 文本格式 Qt::PlainText 纯文本 Qt::RichText 富文本 Qt::MarkdownText markdown 格式 Qt::AutoText 自动识别文本格式 pixmapQLabel 中的图片scaledContents 该属性为 true 表示内容自动拉伸填充 false 则不会拉伸填充 alignment 对齐方式 可以设置水平和垂直方向对齐 wordWrap 设置为 true 文本会自动换行 false 则不会自动换行 indent  设置文本缩进水平和垂直方向都有效 最多设置两个方向有效 具体哪两个方向取决于 alignment 属性 margin 内部文本和边框之间的边距 一般上下左右四个方向都同时有效 openExternalLinks 是否允许打开一个外部连接 如果文本是 url 时会需要 buddy 给 Qlabel 设置一个伙伴点击 Qlabel 会激活伙伴 文本显示 我们设置三个标签。  分别设置为普通文本富文本markdown文本然后分别用不同的语法设置一段文本。  能够看到不同的文本会按不同的语法解析文本从而显示不同的文本。  图片显示 我们先设置一个 Label 控件。 然后将它固定在窗口的左上角并且 label 大小为窗口大小。 同时通过 setScaledContents 来让图片铺满 label。  运行发现图片铺满了整个窗口。  但是如果我们修改窗口大小这个图片不会随着窗口变化而变化。  这是因为这个图片只会铺满整个 label而label又只在初始化铺满了窗口后续窗口变换label并没有变化。 而窗口变化实际上对应窗口的 resizeEvent 函数。 在 Qt 中用户操作有两类概念一个是信号一个是事件而 resizeEvent 也是一种事件。 而 resizeEvent 是 窗口类MainWindow 的父类 QMainWindow的一个函数因此我们可以通过在 MainWindow 中重写 resizeEvent 类即可实现 label 随窗口改变而改变。 这也是C的多态的一种应用。 先在头文件中声明函数。 然后定义函数即触发 resizeEvent 时修改 label 大小使其跟随窗口大小变化。 此时图片是铺满 label 的因此图片也会随着窗口变化而变化。 label的对齐、缩进和边距 label 中的文本我们可以设置 alignment 属性。 alignment 属性一共有以下几种属性。 属性说明Qt::AlignLeft水平靠左Qt::AlignRight水平靠右Qt::AlignHCenter水平居中Qt::AlignJustify水平方向调整间距两端对齐Qt::AlignTop垂直靠上Qt::AlignButton垂直靠下Qt::AlignVCenter垂直居中Qt::AlignCenter居中等价于 AlignVCenter | AlignHCenter Label 中的文本的对齐可以同时在水平和垂直上进行操作。 即 水平方向的要求 | 垂直方向的要求 即可同时控制两个方向。 一般 label 默认水平靠左垂直居中。 并且一般情况下label 的文本是不能自动缩进的如果文本过长后面的文本会看不到因此我们可以设置自动换行。 除此之外还可以设置缩进、边距等我们直接来试着设置一下。 首先整四个 label为了更好的演示给它们设置了边框。 边框即QFrameQLabel 的父类可以自行设置 frameShape。 然后给四个 Label 分别设置 Aligenment、自动换行、首行缩进、边距等设置。 //设置垂直水平居中文本ui-label-setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);ui-label-setText(这是一个垂直水平居中文本);//设置自动换行文本ui-label_2-setAlignment(Qt::AlignTop | Qt::AlignLeft);ui-label_2-setWordWrap(true);ui-label_2-setText(这是一个可以自动换行文本这是一个可以自动换行文本这是一个可以自动换行文本这是一个可以自动换行文本这是一个可以自动换行文本);//设置首行缩进ui-label_3-setAlignment(Qt::AlignTop | Qt::AlignLeft);ui-label_3-setIndent(20);ui-label_3-setText(这是一个设置了首行缩进的文本这是一个设置了首行缩进的文本这是一个设置了首行缩进的文本这是一个设置了首行缩进的文本这是一个设置了首行缩进的文本);//设置边距ui-label_4-setAlignment(Qt::AlignTop | Qt::AlignLeft);ui-label_4-setMargin(20);ui-label_4-setText(这是一个设置了边距的文本这是一个设置了边距的文本这是一个设置了边距的文本这是一个设置了边距的文本这是一个设置了边距的文本这是一个设置了边距的文本);都如预料中一样label_1 居中了label_2 换行了label_3 有首行缩进label_4 有边距。  其中仔细观察 label_3 和 label_4 发现首行缩进只对左侧和上侧有效右侧和底测无效而边距则是四个方向都有效只不过看不出来跟底部有边距罢了 。 buddy label 还可以设置伙伴。 label 设置成 快捷键 A 的形式虽然这里没显示出 .  关键在于 快捷键 的形式如A。 不过这样就能通过 Alt A 来选定第一个 label同理 Alt B 可以选定第二个 label. Label 的 buddy 只能通过 Alt 快捷键的方式响应不能像 PushButton那样直接使用 然后可以在 Qt Designer 中设置 buddy输入对应 buddy 的名称即可绑定。 也可以通过代码形式设置 buddy。  然后就能通过快捷键来选定对应的按钮。 LCD Number控件 LCD Number 是一个显示数字的控件。 属性说明 intValue 以 int 形式显示数字 value 以 double 形式显示数字 该value 和 intValue 是联动的value 1.5 在 intValue 显示2. 而设置 intValue 和 value 的API 是 display mode 数字形式 QLCDNumber::Dec : 十进制 QLCDNumber::Hex : 十六进制 QLCDNumber::Bin : 二进制 QLCDNumber::Oct : 八进制 segmentStyle 数字显示风格 QLCDNumber::Flat 平⾯的显⽰⻛格数字呈现在⼀个平坦的表⾯上 QLCDNumber::Outline 轮廓显⽰⻛格数字具有清晰的轮廓和阴影效果 QLCDNumber::Filled 填充显⽰⻛格数字被填充颜⾊并与背景区分 开 digitCount显示几位数字smallDecimalPoint设置比较小的小数点 接着我们通过 LCDNumber 设置一个计时器。 首先在头文件添加一个 QTimer 对象和一个函数。 QTimer 对象在每一个时间间隔中都会发出一个 timeout 的信号我们将该信号和我们创建的函数绑定在一起。 并且设置 QTimer 对象每过1秒响应一次即时间间隔为1秒。 并且设置 lcdNumber 初识数字为3. MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui-setupUi(this);ui-lcdNumber-display(3);timer new QTimer(this);connect(timer,QTimer::timeout,this,MainWindow::UpdateTime);timer-start(1000);}MainWindow::~MainWindow() {delete ui; }void MainWindow::UpdateTime() {int value ui-lcdNumber-intValue();if(value 0){timer-stop();return;}ui-lcdNumber-display(value - 1); }而我们设定的函数则是获取 lcdNumber 的值如果为0就退出否则更新值为 value - 1. 可以看到确实成功了。 之前在 C实现计时器的时候可以通过sleep 循环的方式实现这里呢能否在构造函数中采用 sleep 循环的方式实现一个计时器吗答案是不行的。 像这样的代码形式 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-setupUi(this);int value ui-lcdNumber-intValue();while (true) {std::this_thread::sleep_for(std::chrono::seconds(1));if (value 0) {break;}ui-lcdNumber-display(value - 1);} } 因为循环会导致构造函数无法完成界面无法正确构造和显示。 那如果采用线程中采用 sleep 循环呢 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-setupUi(this);std::thread t([this]() {int value this-ui-lcdNumber-intValue();while (true) {std::this_thread::sleep_for(std::chrono::seconds(1));if (value 0) {break;}this-ui-lcdNumber-display(value - 1);}}); } 这也是不允许的因为 Qt 规定所有在GUI上的操作都必须在主线程中完成。像 connect 函数构造函数都是在主线程上完成的。 这是因为GUI的修改牵一发而动全身如果可以通过线程修改一个GUI那么其他的东西也需要修改如字体颜色样式等这需要确定一定的顺序而多线程无法保证顺序因此 QT 直接 ban 了这种操作。 ProgressBar控件 该控件是一个进度条。 属性说明minimum进度条最小值maximum进度条最大值value进度条当前值alignment 文本在进度条中的对齐方式 Qt::AlignmentLeft 左对齐 Qt::AlignmentRight 右对齐 Qt::AlignmentCenter 居中对齐 Qt::AlignmentJustify 两端对齐 textVisble进度条的数字是否可见orientation进度条方向是水平还是垂直invertApperance是否朝反方向增长textDirection文本的朝向format 展示的数字格式 %p 表示进度的百分比 (1-100) %v 表示进度的数值(1-100) %m表示剩余时间(以毫秒为单位) %t表示总时间(以毫秒为单位) 我们可以自己通过QT Designer 或者代码的形式更改进度条的形式。 和计时器一样先设定一个定时器和一个槽函数。 然后绑定 timeout 信号和这个槽函数。 而槽函数内部就是将进度条的数据1.直到100  可以看到确实从1到100的进度条了。 而颜色之类的我们也可以在QT Designer 中修改。 可以通过修改 styleSheet 修改。 不过需要注意代码方式和这种方式只能二选一不能既要又要哦。  设置颜色的语言有很多种像代码方式那样用 rgb 来表示可以通过这种方式也是可以设置的。 chunk 是选中进度条中的每一块即背景的颜色。 而 QProgressBar::text 则是选中数字修改数字的颜色。 Calendar Widget控件 Calendar Widget 是一个日历控件。 属性说明selectDate当前选中的日期minimumDate最小日期maximumDate最大日期firstDayOfWeek每周的第一天是周几即日历的第一列gridVisible是否显示表格的边框selectionMode是否允许选择日期navigationBarVisible日历上方标题是否显示horizontalHeaderFormat日历上方标题显示日期格式verticalHeaderFormat日历第一列显示的内容格式dateEditEnabled是否允许日期被编辑 日历的重要信号 信号说明selectionChanged(const QDate)当选中的日期发生改变时触发activated(const QDate)当双击一个有效的日期或者按下回车键时发出形参的 QDate 保存了当前选中的日期currentPageChanged(int,int)当年份月份改变时发出形参表示改变后的新年分和月份 我们设立三个控件projectName 分别是 label、label_2、calendarWidget 三个控件。  然后为Calendar Widget 控件添加槽函数。 可以看到确实 label 的文本修改了换页时 label_2 的文本被修改了。 输入类控件 LineEdit 控件 属性说明 text 输入框中的文本inputMask 输入内容约束 可以约束输入的格式的形式 maxLength最大长度frame是否添加边框echoMode 显示方式 QLineEdit::Normal : 默认能够显示出文本 QLineEdit::Password : 输入的文本会被 *  或者替代 QLineEdit::NoEcho 输入的文本不会显示 cursorPosition当前光标的位置alignment文字对齐方式设置水平和垂直方向的对齐dragEnabled是否允许拖拽readOnly是否允许只读不可修改placeHolderText输入框为空时显示的提示信息clearButtonEnabled是否自动显示 “清除按钮” 核心信号 信号说明void cursorPosition(int old,int new)当鼠标移动时发出信号old 为之前的位置new为现在的位置void editingFinished()当按返回键和回车键时或者行编辑失去焦点时发出此信号void returnPressed() 当按返回键和回车键时发出此信号 如果设置了验证器则必须通过验证才能发出 void selectionChanged()当选中的文本改变时发出该信号void textChanged(cosnt QString text)当QLineEdit的文本修改时发出信号text是新文本代码修改能够触发该信号void textEdited(const QString text)当QLineEdit的文本修改时发出信号text是新文本代码修改不能够触发该信号 通过该控件我们可以设置一个简单的登录界面。 在 QtDesigner 中设置如下界面。 分别给三个 lineEdit 控件设置文本并且设置好对应的 echomode . 再给pushbutton按钮设置好槽函数。  就得到了如下的界面并且设置了清除按钮的lineEdit控件可以一次性清空数据。 不过这里有一个问题那就是电话号码是有自己的格式的即有11位开头是1后面全是数字。 如果我们提交了一个错误的电话号码就应该是无效的。 这里我们可以通过设置正则表达式来验证电话号码是否符合格式。 首先通过正则表达式创建一个 QRegExp 对象其正则表达式是以1开头共11个数字。 然后给 lineEdit_telphone 设置一个 validator验证器其中 QValidator有四种我们用其中一种来设置验证器 。 因为我们用到正则表达式来验证因此用 QRegExpValidatorQRegularExpressionValidator 和这个验证器类似不过有匹配优化 设置好验证器后在输入的时候 lineEdit 会发出一个信号通过捕捉该信号再通过槽函数即可验证是否成功。 通过 lineEdit_telphone 的验证器的 validate 函数来验证文本是否符合格式不过由于 参数分别是 QString 和 int ,因此需要通过一个 QString 对象来复制一下文本int 的参数没什么用验证失败的时候该参数会返回验证失败的位置。 QValidator::State 有三个参数 Invalid(违法)、Intermediate(无法判断)、Accepptable(验证成功) 在一般的登录界面上一般可以显示出密码的内容我们可以通过添加一个按钮实现。 添加了一个checkBox按钮。当它状态转换时就更换 lineEdit 的 EchoMode。 发现点击之后就能够看到密码了。 Text Edit控件 QTextEdit 是一个多行的输入框也是一个富文本和 markdown 编辑器在文本超过范围时提供滚动条。 属性说明markdown输入框持有的内容支持 markdown 格式会自动将markdown文本渲染成htmlhtml输入框持有的内容支持大部分html标签包括img、table等placeHolderText输入框为空时提示内容readOnly是否是只读的undoRedoEnable 是否开启undo/redo功能 ctrl z 为undo(撤销) ctrl y 为redo(恢复) autoFormating 开启自动格式化 默认为AutoNone即不开启格式化 AutoBulletList 自动创建项目列表如 在最左侧列输入 * 号或者在现有表项中按 enter 键 AutoAll启动所有格式化不过只有 AutoBulletList tabstopWidth按下缩进占多少空间overwriteMode是否开启覆写(即无法从中间开始输入只能覆盖)acceptRichText是否接受富文本内容verticalScrollBarPolicy 垂直方向滚动条出现的策略 Qt::ScrollBarAsNeeded 默认值 根据需要出现 Qt::ScrollBarAlwaysOff: 总是关闭滚动条 Qt::ScrollBarAlwaysOn总是显示滚动条 horizontalScrollBarPolicy 水平方向滚动条出现的策略 Qt::ScrollBarAsNeeded 默认值 根据需要出现 Qt::ScrollBarAlwaysOff: 总是关闭滚动条 Qt::ScrollBarAlwaysOn总是显示滚动条 核心信号 信号说明textChanged()文本内容改变时触发selectionChanged()选中范围改变时触发cursorPositionChanged()光标移动时触发undoAvailable(bool)进行undo操作时触发redoAvailiable(bool)进行redo操作时触发copyAvailiable(bool)文本被选中/取消选中时触发 我们可以测试一下各种信号。  为 redo、undo、copy 和各种光标变化、文本变化添加槽函数。  能够发现在输入的时候redoavailiable 是false而 undoavailiable则是 true。 而当按下 ctrl z 进行undo操作后undoavailiable 则是false、redoavailiable则是true。 而按下 ctrl y 进行 redo 操作后 redoavailiable 则变成了false、undoavailiable 则是true。 这说明 undo 操作和 redo 操作是相互依赖的。 而如果选中了一批内容 copyavailiable 就成true没有选中就成false了。 Combo Box控件 核心属性 属性说明currentText当前选中的文本currentIndex 当前选中的条目下标 从0开始计算如果没有选中则为-1 editable 是否允许修改 为true时该控件类似 QLineEdit也可以设置validator iconSize下拉框图标小三角的大小maxCount最多允许有多少个条目 核心方法 方法说明addItem(const QString)添加一个条目currentIndex() 获取当前条目的下标 从0开始计算如果没有选中则为-1 currentText()获取当前条目的文本内容 核心信号 信号说明 activated(int) activated(const QString text) 当用户选择了一个选项时发出 即用户点开下拉框并且鼠标滑过某个选项 但是没有做出选中时发出 currentIndexChanged(int) currentIndexChanged(const QString text) 当前选项改变时发出. 此时⽤⼾已经明确的选择了⼀个选项 ⽤⼾操作或者通过程序操作都会触发这个信号 editTextChanged(const QString text) 编辑框中的文本改变时发出 editable为true时有效 我们先来使用一下 Combo box 的简单使用。 在Qt Designer 中添加一个 combobox 通过 addItem 方法添加几个条目。  这样就能够通过 combo box 右侧的下拉键来自由选择添加的条目。 不过一般这些条目都是从文件或者网络中获取。 这里我们创建一个 combo.txt 的文件。 然后通过文件流获取由于获取的是string而非 QString因而在添加条目时需要通过函数转化一下  能够看到确实如此。  Spin Box控件 SpinBox是一个微调框根据内容不同有 QSpinBox 和 QDoubleSpinBox 两个控件不过两个使用方式都一样不过一个是用于整型一个是用于小数形式的。 由于二者的核心属性和信号都一样因此这里只阐述 QSpinBox 控件。 SpinBox 控件不可输入负数 属性说明value当前存储的数值singleStep每次加减变化的数值displayInteger采用的进制形式为10则表示十进制minimum最小值maximum最大值suffix后缀prefix前缀wrapping是否能够换行frame是否带边框alignment文字对齐方式readOnly是否只读buttonSymbol 按钮图标 UpDownArrows 箭头形式PlusMinus 加减号形式NoButtons 没有按钮accerlerated按下按钮时是否为快速调整模式correctionMode 输入有误时如何修正 QAbstractSpinBox::CorrectToPreviousValue 输入一个无效值自动变为上一个有效值。例如初始值为1如果输入一个负数自动变成1QAbstractSpinBox::CorrectToNearestValue输入一个无效值自动变为最接近的有效值例如输入一个负数自动变成0keyboardTrack 是否开启键盘追踪 true 输入数字就会发出valueChanged() 和 textChanged() 信号false按下回车才会触发 valueChanged() 和 textChanged() 信号 核心信号 信号说明valueChanged() SpinBox 的文本修改时触发 参数 int 表示当前数值 textChanged() SpinBox 的文本修改时触发 参数QString表示当前的前缀和后缀 我们随便整一个 SpinBox 设置它的 keyboardTrack 属性为true即数字改变发送 valueChanged 信号并通过槽函数输出 我们发现即便我们还在输入中也会收到 valueChanged 信号。如果设置 keyboardTrack 属性为 false 则只有在按下 Enter 的时候发出信号。  Date Edit Time Edit控件 有三种微调框 QDateEditQTimeEditQDateTimerEdit 这三种都类似只了解一种即可。 我们来了解 QDateTimeEdit 控件。 属性说明dateTime时间日期的值如 2025/1/1 0:00:00date单纯日期的值time单纯时间的值displayFormat 时间日期格式如 y/m/d h:m:s y 年m 月d 日h时m分s 秒不同的语言中有不同的区别使用的时候再去查找 minimunDateTime最小日期时间maximumDateTime最大日期时间timeSpec Qt::LocalTime: 显示本地时间Qt::UTC 显示世界时间Qt::offsetFromUTC : 显示相对于世界时间的时差 核心信号 信号说明timeChanged(QTime)时间改变时触发dateChanged(QDate)日期改变时触发dateTimeChanged(QDateTime)时间日期任意改变时触发 我们可以简单的做出一个日期计算器。  设置两个 QdateTimeEdit 分别是 old 和 new. 然后给 pushbutton 设置一个槽函数。 通过 QDateTime 对象获取到两个微调框的时间。 然后通过 daysTo 函数获取 从 new 到 old 的天数secsTo 函数获取从new 到 old 的秒数再通过 /3600 后获取有多少个小时再 %24 来得到多少个小时最后输出在 label 上。  发现确实成功获得数据了 Dial 控件  QDial 表示一个旋钮。 绘画软件中有一个重要的部分——调色板它能够以旋钮的方式来调出画家想要的颜色QDial 就是类似的旋钮。 属性说明value持有的数值minimum最小的数值maximum最大的数值singleStep按下方向键的时候改变的步长pageStep按下 pageUp/pageDown 的时候改变的步长sliderPosition界面上旋钮显示的初识位置tracking 外观是否会跟踪数值变化 默认为 true一般不需要修改 wrapping 是否允许循环调整 即超过最大值是否会回到最小值 notchesVisible是否显示刻度线notchTarget 刻度线之间的相对位置 数字越大刻度线越稀疏 核心信号 信号说明valueChanged(int)数值改变时触发rangeChanged(int,int)范围变化时触发 我们设置一个 dial 和 一个 label。  设置好 dial 的初始值可以循环。 给 dial 控件的 valueChanged 信号设置槽函数。  可以看到确实成功了。  Slider控件 QSlider 是一个滑动条。 由于 QDial 和 QSlider 都继承自QAbstractSlider因此用法其实类似。 属性说明value当前的数值minimum最小值maximum最大值singleStep按下方向键修改的步长pageStep 按下 pageUp/pageDown 的时候改变的步长 sliderPosition滑动条显示的初识位置tracking 外观是否跟随数值变化 默认为true orientation滑动条的方向是水平还是垂直invertedAppearance是否需要翻转滑动条的方向tickPosition刻度的位置tickInterval刻度的密集程度 核心信号 信号说明valueChanged(int)数值改变时触发rangeChanged(int,int)范围变化时触发 我们设置两个 Slider 控件分别是垂直的和水平的。  设置好初始值由于verticalSlider垂直滑动条 是上大下小因此设置翻转。 然后设置它们的槽函数。 水平的修改窗口的 width垂直修改窗口的 height。 能够看到确实修改了窗口的大小。  一般Slider控件默认可以通过 pageDown/pageUp 或者 方向键控制。 选中某个 Slider 控件即可通过这些按键来控制Slider控件。 我们也可以自定义快捷键。 这里定义了 - 和 两个快捷键并绑定它们的槽函数。 这里只修改水平滑动条的数值。  可以发现确实成功绑定了新的快捷键。  多元素控件 在QT中提供一些多元素控件。 QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView  xxWidget 都是 xxView 的子类它们之间的区别是 xxView 是底层一点的实现xxWidget 则是对 xxView 进行了封装。 xxView 是基于 MVC 设计的控件它属于 MVC 机制中的 V即视图它只提供一个视图而保存数据、以及数据和视图之间的交互不由它管需要用户自己定义。 xxWidget 则是基于 xxView 的基础上进行了封装它内部有数据和控制器不用用户自己定义直接往 xxWidget 内部输入数据即可。 就比如用户使用 xxView 的时候需要创建一个Model 对象如QStandardModel) 并且将Model对象和View对象绑定起来这样修改Model对象的数据会影响View的显示修改View的显示也会影响到Model的数据。 不过Widget对象则直接使用即可。 ListWidget控件 QListWidet是一个列表其内部的选项都能选中。 属性说明currentRow当前选中的行号count一共有多少行sortingEnabled是否允许倒序isWrapping是否允许换行itemAlignment元素对齐方式selectRectVisible被选中的元素是否可见spancing元素之间的间隔 核心方法 方法说明 addItem(const QString label) addItem(QListWidgetItem* item) 列表中添加元素currentItem()返回当前选中的元素setCurrentItem(QListWidgetItem* item)设置选中的元素setCurrentRow(int row)设置选中第几行的元素 insertItem(const QString label,int row) insertItemQListWidgetItem* item,int row) 在指定的行号插入元素item(int row)返回第row行的元素takeItem(int row)删除指定行的元素 核心信号 信号说明 currentItemChanged(QListWidgetItem* current, QListWidgetItem* old) 选中不同元素时触发参数是当前选中的元素和之前选中的元素currentRowChanged(int)选中不同的元素时触发返回当前选中的行号itemClicked(QListWidgetItem* item)点击某个元素触发 itemDoubleClicked(QListWidgetItem* item)  双击某个元素触发itemEntered(QListWidgetItem* item)鼠标进入元素时触发 在上述的介绍中涉及一个关键的类——QListWidgetItem。 它是QListWidget 中的元素本质就是一个文本图标它有以下方法 方法说明setFont设置字体setIcon设置图标setHidden设置隐藏setSizeHint设置尺寸setSelected设置是否选中setText设置文本setTextAlignment设置文本对齐方式 接下来我们使用下ListWidget控件。 拖拽一个 ListView右键后选择变型为变成ListWidget。 然后添加两个按钮和一个lineEdit。  两个按钮的槽函数如下设置。  发现确实能够新增或者删除元素。  TableWidget控件 该控件是一个表格有多行每一行有多列每一个单元格都是一个 QTableWidgetItem 对象。 核心方法 方法说明item(int row,int col)获取对应行、列的 QTableWidgetIten 对象setItem(int row,int col,QTableWidget*)设置对应行、列为对应的元素currentItem()返回被选中的元素currentRow()返回被选中的元素是第几行currentColumn()返回被选中的元素是第几列row(QTableWidgetItem*)获取指定 item 是第几行column(QTableWidgetItem* )获取指定的 item 是第几列rowCount()获取行数columnCount()获取列数insertRow(int row)在第 row 行插入新行insertColumn(int column)在第 column 列插入新列removeRow(int row)删除第 row 行removeColumn(int column)删除第 col 列setHorizontalHeaderItem(int column,QTableWidget*)设定指定列的表头setVerticalHeaderItem(int row,QTableWidget*)设定指定行的表头 该控件和 QTableWidgetItem 类关系密切需要了解以下这个类。 QTableWidgetItem 类的核心信号 信号说明cellClicked(int row,int column)点击单元格触发cellDobleClicked(int row,int column)双击单元格触发 cellEntered(int row,int column) 鼠标进入单元格时触发currentCellChanged(int row,int column,int previousROw,int previousColumn)选中不同单元格时触发 QTableWidgetItem 类的核心方法 方法说明row()返回当前的行号column()放回当前的列号setText(const QString str)设置文本setTextAlignment(int)设置文本对齐setIcon(const QIcon icon)设置图标setSelected(bool)设置被选中setSizeHints(const QSize)设置尺寸setFont(const QFont)设置字体 咱们设置一个 QTableWidget 控件和四个按钮以及一个 lienEdit。  四个按钮的槽函数如下。  可以看到确实成功的添加行、列、删除行、列了。  TreeWidget控件 QTreeWidget 是一个树形控价类似文件系统一样其中每一个元素都是QTreeWidgetItem。 每一个 QTreeWidgetItem 可以包含多个文本和图标一个文本或者图标算一列。 实际上 TreeWidget 更像一个 伪 ListWidget它并不像一般的二叉树有根节点而是从根节点的下一层开始计算的。 因此如果直接调用 QTreeWidget 的函数实际上都是针对顶层节点进行操作。 如果想在顶层节点下添加节点就需要先获取顶层节点然后再对顶层节点添加子节点。 接下来了解一下QTreeWidget 的函数吧。 核心方法 方法说明clear清空所有节点addTopLevelItem(QTreeWidgetItem* item)新增顶层节点topLevelItem(int index)获取下标为index 的顶层节点topLevelItemCount()获取顶层节点的个数indexOfTopLevelItem(QTreeWidgetItem* item)获取指定顶层节点的下标takeTopLevelItem(int index) 删除指定下标的顶层节点 并且返回被删除的元素 currentItem()获取当前选中的节点setCurrentItem(QTreeWidget* item)选中指定节点setExpanded(bool)展开/关闭节点setHeaderLabel(const QString text)设定 TreeWidget 的名称 核心信号 信号说明currentItemChanged(QTreeWidgetItem* current,QTreeWidgetItem* old)切换选中元素时触发itemClicked(QTreeWidgetItem* item,int col)点击元素时触发itemDoubleClicked(QTreeWidgetItem* item,int col)双击元素时触发itemEntered(QTreeWidgetItem* item,int col)鼠标进入时触发itemExpanded(QTreeWidgetItem* item)元素展开时触发itemCollaspend(QTreeWidgetItem* item)元素折叠时触发 QTreeWidgetItem 属性 属性方法text持有的文本textAlignment文本对齐方式icon持有的图标font文本字体hidden是否隐藏disabled是否禁用expand是否展开sizeHint尺寸大小selected是否选中 QTreeWidgetItem 方法 方法说明addChild(QTreeWidgetItem* item)新增子节点childCount()获取子节点的个数child(int index)获取指定的子节点takeChild(int index)删除指定的子节点removeChild(QTreeWidgetItem* item)删除指定的子节点parent()获取对应的父节点 了解了控件和元素的属性方法后来试着直接使用一下。 选择QTreeWidget、LineEdit、pushButton三个控件 全部设置好。 按钮的槽函数如下。 然后就能够成功添加节点或者顶层节点了。  容器类控件 容器类控件就是能够包含多个控件的控件在容器类控件下的控件他们的父节点应该是对应的容器类节点。 GroupBox控件 该控件是一个带有标题的分组框它没有什么实际作用只是用来界面美化的。 属性说明title分组框的标题alignment分组框内部内容的对齐方式flat是否是扁平模式checkable 是否可以选择 为 ture 时前方多出一个可勾选的部分 checked描述分组框的选择状态checkable必须为true 有一点需要注意分组框内部的控件的父节点是分组框本身而非窗口。 Tab Widget 控件 QTabWidget 是一个标签页。 可以设置多页然后每一页可以添加不同的Widget通过页切换来选择不同的widget。 属性说明tabPosition 标签页所在位置 North 上方South 下方West 左侧East 右侧currentIndex当前选中了第几个标签页currentTabText当前选中标签的文本currentTabName当前选中标签的名字currentTabIcon当前选中标签的图标currentTabToolTip当前选中标签的提示信息 tabsCloseable 标签页是否能够关闭movable标签是否可以移动 核心信号 信号说明currentChanged(int)标签页切换时触发参数为被点击的标签页号tabBarClicked(int)点击选项卡的标签条时触发参数为被点击的选项卡编号tabBarDoubleClicked(int)双击选项卡的标签条时触发参数为被点击的选项卡编号tabCloseRequest(int)在标签页关闭时触发参数为被关闭的选项卡编号 有一点需要注意Tab Widget 每一页都是一个 QWidget点击标签页即可切换。 添加标签页也是新增一个 QWidget 而这一页中的所有控件的父节点都应该是这个QWidget。 咱们添加两个按钮和一个 TabWidget 控件。  可以看出确实成功了。  布局管理器 在Qt Designer 上进行的控件布局一般都是绝对定位的但是当控件很多的时候就会很不方便因此Qt 引入了 布局管理器layout) 机制来解决上述问题。 垂直布局 QVBoxLayout表示垂直布局管理器。 属性说明layoutLeftMargin左侧边距layoutRightMargin右侧边距layoutTopMargin上方边距layoutButtonMargin下方边距layoutSpacing相邻元素之间的边距 通过代码方式需要通过 addWidget 方法将控件添加到 管理器中。  有一点需要注意在创建项目时需要采用 QWidget而非QMainWindow。 这是因为 QMainWindow 默认自带一个 layout 而一个Widget中只能存在一个 layout因此不能使用 QMainWindow。 可以看到三个按钮垂直布局并且可以随着窗口变化而变化。 在刚刚已经讲过一个Widget只能有一个 layout不过在QtDesigner 中我们能够创建多个布局管理器。 但是这样的方式创建的layout不会随着窗口变化而变化。 这是因为QTDesigner在创建layout时会自动创建一个QWidget。 在xml形式的ui文件中可以看到创建的QWidget而这也是layout不会随着窗口变化的原因。 水平布局 使用QHBoxLayout表示水平布局管理器。 属性说明layoutLeftMargin左侧边距layoutRightMargin右侧边距layoutTopMargin上方边距layoutButtonMargin下方边距layoutSpacing相邻元素之间的边距 用法和特性跟垂直布局管理器一样。 而垂直布局和水平布局二者可以互相嵌套。 二者互相嵌套就能够做出很复杂的界面了。  网格布局  QGridLayout表明网格布局管理器。 属性说明layoutLeftMargin左侧边距layoutRightMargin右侧边距layoutTopMargin上方边距layoutButtonMargin下方边距layoutHorizontalSpacing相邻元素水平间距layoutVerticalSpacing相邻元素垂直间距layoutRowStretch行方向拉伸系数layoutColumnStretch列方向拉伸系数 正如名字所说该布局管理器是以网格方式排列的因此它在 addWidget 时需要指定列和行。 如图所示。  如果我们将Widget全部放一行或者全部放一列就会得到类似 水平布局或者垂直布局的结果。 不过也要注意如果说设置了一个很大的值但是这个值和上个值之间没有其他元素那么中间也不会腾出其他控件。 比如之前只有3行但是你如果添加一个在第10行的元素它也是直接在第三行元素下面。 我们还可以设置每个按钮的拉伸系数。 这里设置第一列的拉伸系数为1第二列不拉伸第三列拉伸系数为3. 能够得到如下界面。  当然我们也可以设置垂直的拉伸系数不过有一个问题那就是按钮的高度都是固定的因此需要设置按钮的垂直方向的 sizePolicy 为 QSizePolicy::Expanding。 QPushButton的尺寸策略 QSizePolicy::Ignored : 忽略控件尺寸QSizePolicy::Minimum : 最小的尺寸为固定值布局不会超过该值QSizePolicy::Maximum : 最大的尺寸为固定值布局不会超过该值QSizePolicy::Prefered : 理想的尺寸为固定值布局尽量接近该值QSizePolicy::Expanding : 控件的尺寸随着空间调整尽可能占据空间QSizePolicy::Shrinking : 控件的尺寸随着空间调整尽可能缩小 这样才能看到垂直拉伸的效果。  表单布局 QFormLayout是QGridLayout的一种特殊情况专门用来实现两列表单的布局。 可以看到得到如下界面。  Spacer 有时候需要在空间之间添加空白这时候就需要 QSpacerItem 表示 。 属性说明width宽度height高度hData ⽔平⽅向的 sizePolicy • QSizePolicy::Ignored : 忽略控件的尺⼨不对布局产⽣影响。 • QSizePolicy::Minimum : 控件的最⼩尺⼨为固定值布局时不会超过该值。 • QSizePolicy::Maximum : 控件的最⼤尺⼨为固定值布局时不会⼩于该值。 • QSizePolicy::Preferred : 控件的理想尺⼨为固定值布局时会尽量接近该值。 • QSizePolicy::Expanding : 控件的尺⼨可以根据空间调整尽可能占据更多空间。 • QSizePolicy::Shrinking : 控件的尺⼨可以根据空间调整尽可能缩⼩以适应空间。 vData垂直方向的sizePolicy 可以看到按钮之间有间距。  也可以在QtDesigner中添加。 总结 目前我们了解了QT项目中大部分常用的控件以及其属性、信号和方法也算是正式入门Qt了。 不过本文并没有将所有的方法都写出来不过实际上都挺简单的各位使用到不熟的控件可以自行搜索用法。
http://www.tj-hxxt.cn/news/220937.html

相关文章:

  • 装企营销网站建设有什么网站可以免费做图
  • 网站建设平面要多少分辨率公司做网站费用会计处理
  • 东莞市国外网站建设平台北京谷歌seo公司
  • 上海电商网站开发没有网站也可以做推广吗
  • .net电商网站开发设计郑州哪家公司做网站
  • 专业建设外贸网站制作怎么用polylang做网站菜单
  • 网站建设音乐插件怎么弄合肥竞价推广
  • 怎样做自己的公司网站网站云解析域名解析
  • 网站开发基础语言汕尾住房和建设局网站首页
  • 广州做网站制作公司深圳做网站最
  • 建站行业乱象完整版51推广平台
  • 用qq空间做网站网站建网站建设企业
  • 阜新门户网站建设怎么优化电脑系统
  • 手机网站模板 餐饮vs网站开发表格大小设置
  • 电商公司建设网站app开发企业网站建设
  • 男女做暧暧观看免费网站网站建设网络公关
  • seo建站是什么怎么做网站推广软件
  • 北京龙鼎网站建设公司重庆模板自助建站
  • 湛江 网站建设seo还有前景吗
  • 中国建设银行手机银行家网站上海 企业网站制
  • 德阳市建设局官方网站安全月给公司网站做seo的好处
  • 青岛网站建设鲁捷云兰州解封最新消息
  • 怎么申请域名建网站杭州市建设工程招标平台
  • 适合seo优化的网站制作平台网站建设过程
  • mk厂手表网站郑州装修公司排名
  • 最新在线代理服务器深圳网络优化培训
  • 自己做外贸开通什么网站dede关闭手机网站
  • 整人网站怎么做怎么做卖辅助网站
  • 做暖暖视频网站大全金牛区建设审批网站
  • 网站建设招商dw制作企业网站