在上个世纪的文章中,老周简单介绍了QWindow类的基本使用——包括从QWindow类派生和从QRasterWindow类派生。 其实,QWindow类并不是只能充当主窗口用,它也可以嵌套到父级窗口中,变成子级对象。咱们一般称之为【控件】。F话不多讲,下面咱们用实际案例来说明。 这个例子中老周定义了两个类: MyControl:子窗口对象,充当控件角色。这里实现一个类似开关的控件。【关闭】状态下,控件的背景呈现为灰色,金色方块位于最左侧;当控件处于【开启】状态下,控件背景为红色,金色方块位于最右侧。 MyWindow:作为窗口使用,里面包含MyControl对象。 先看MyCont...

  omQ9qq6Upg4c   2023年11月02日   68   0   0 C++

剪贴板是个啥就不用多介绍了,最直观的功能是实现应用程序之间数据共享。就是咱们常说的“复制”、“粘贴”功能。 在Qt中,QClipboard类提供了相关API让应用程序具备读/写剪贴板的能力。数据通过 QMimeData类包装。该类使用MIME类型来标识数据。比如,要包装的数据是纯文本内容,就使用text/plain;如果是PNG图像数据,就用image/png。当然,自定义类型也是可以的,如application/xxx。 QMimeData的核心方法是setData和data。setData方法用来放入数据,data方法用来取出数据。setData方法的签名如下: voidset...

  omQ9qq6Upg4c   2023年11月02日   57   0   0 C++

由于老周的示例代码都是用VSCode+CMake+Qt写的,为了不误导人,在标题中还是加上“VSCode”好一些。 上次咱们研究了剪贴板的基本用法,也了解了叫QMimeData的重要类。为啥要强调这个类?因为接下来扯到的拖放操作也是和它有关系。哦,对了,咱们先避开一下主题,关于剪贴板,咱们还要说一点:就是如何监听剪贴板内数据的变化并做出响应。这个嘛,就有点像迅雷监听剪贴板的功能,发现你复制的东西里包含有下载地址的话,就自动弹出新下载任务窗口。 QClipboard类有好几个满足此功能的信号,说这个前咱们要先知道一下QClipboard类包含一个Mode枚举。这个枚举定义了三个成员: QClip...

  omQ9qq6Upg4c   2023年11月02日   70   0   0 C++

本篇专门扯一下有关QCheckBox组件的一个问题。老周不水字数,直接上程序,你看了就明白。 include<QApplication> include<QWidget> include<QPushButton> include<QCheckBox> include<QVBoxLayout> include<QIcon> intmain(intargc,charargv) { QApplicationapp(argc,argv); //最平庸的窗口 QWidgetwindow; window.setWindowTitl...

  omQ9qq6Upg4c   2023年11月02日   25   0   0 C++

如果某个派生自QObject的类重写eventFilter方法,那它就成了事件过滤器(EventFilter)。该方法的声明如下: virtualbooleventFilter(QObjectwatched,QEventevent); watched参数是监听事件的对象,即事件的接收者;event参数当然就是待处理的事件了。事件过滤器(也可以翻译为“筛选器”)可在接收者之前拦截事件,处理完毕后还可以决定是否把事件转发给接收者。如果不想转发给事件接收者,就返回true;若还想让事件继续传播就返回false。 这玩意儿最有益的用途就是:你的顶层窗口上有K个子级组件(正常情形是QWidget的子...

  omQ9qq6Upg4c   2023年11月02日   52   0   0 C++

QAction类表示用户命令的一种抽象,包括命令文本、图标、命令触发后要执行的代码。菜单、工具栏按钮往往存在相同的功能,将这些命令独立抽出来,放到QAction以象上,可避免编写重复的代码。比如“文件”菜单下有“保存”命令,工具栏上也会有“保存”按钮。因此,创建一个表示“保存”的QAction对象,同时添加到菜单和工具栏中,它们就能共享相同的功能。 以上F话了这么多,就是为了明确QAction类的作用。在创建QAction实例时,可以通过构造函数传递命令的文本,或图标。如果在调用构造函数时不指定,那么可以用下面这些方法来“补做”: 1、setText方法:设置命令文本。显示在用户界面上的文本;...

  omQ9qq6Upg4c   2023年11月02日   21   0   0 C++

在开始主题前,先看一个C例子: include<iostream> structData { inta; intb; }; //注意这里 structDatas; voiddoSome() { Datak; k.a=100; k.b=300; //注意这里,会出大事 s=&k; } intmain() { //先调用了函数 doSome(); //再输出Data结构体的内容 std::cout<<"a="<<s->a<<'\n'; std::cout<<"b="<<s->b<<'\...

  omQ9qq6Upg4c   2023年11月02日   23   0   0 C++

工具提示即ToolTip,当用户把鼠标移动到某个UI对象上并悬停片刻,就会出现一个“短小精悍”的窗口,显示一些说明性文本。一般就是功能描述,让用户知道这个XX是干啥用的。 在Qt中使用工具提示最方便的做法是直接用QWidget类的成员方法:setToolTip。从QWidget类派生的组件都可以用,直接设置文本内容即可,用起来很666。 下面举个例子:示例窗口上有三个单选按钮(QRadioButton),分别为它们设置工具提示。 include<qapplication.h> include<qwidget.h> include<qboxlayout.h>...

  omQ9qq6Upg4c   2023年11月02日   29   0   0 C++

列表模型(ItemModel),老周没有翻译为“项目模型”,因为Project和Item都可以翻译为“项目”,容易出现歧义。干脆叫列表模型。这个模型也确实是为数据列表准备的,它以MVC的概念为基础,在原始数据和用户界面视图之间搭建桥梁,使两者可以传递数据(提取、修改)。 Qt里面使用列表控制比较复杂,需要先创建模型(Model)。当然,也有像QListWidget类这样已经封装好,开箱即食的,这个后面再扯,现在咱们的重点是弄清楚ItemModel是啥玩意儿。 这里所说的ItemModel并不是真正的数据,应该说算是个控制器。当用户界面要显示数据时,模型负责从原始数据那里提取值,再把值传到界面上...

  omQ9qq6Upg4c   2023年11月02日   31   0   0 C++

前一篇水文中,老周演示了 QAbstractItemModel抽象类的继承方法。其实,在Qt的库里面,QAbstractItemModel类也派生了两个基类,能让开发者继承起来【稍稍】轻松一些。 这两个类是 QAbstractListModel和 QAbstractTableModel。 QAbstractListModel类专门用来实现一维列表结构模型的。它实现了index、parent等方法,并且把columnCount方法变成了私有成员(一维列表不需要它)。继承时直接实现rowCount、data、setData这几个方法即可; QAbstractTabl...

  omQ9qq6Upg4c   2023年11月02日   26   0   0 C++

QStandardItemModel类作为标准模型,主打“类型通用”,前一篇水文中,老周还没提到树形结构的列表,本篇咱们就好好探讨一下这货。 还是老办法,咱们先做示例,然后再聊知识点。下面这个例子,使用QTreeView组件来显示数据,使用的列表模型比较简单,只有一列。 include<QApplication> include<QTreeView> include<QStandardItem> include<QStandardItemModel> intmain(intargc,charargv[]) { QApplicationapp(...

  omQ9qq6Upg4c   2023年11月02日   28   0   0 C++

BlazorServer,即运行在服务器上的Blazor应用程序,它的优点是应用程序在首次运行时,客户端不需要下载运行时。但它的代码是在服务器上执行的,然后通过SignalR通信来更新客户端的UI,所以它要求必须建立WebSocket连接。 用于Blazor应用的SignalRHub是 ComponentHub,默认的连接地址是/_blazor。多数时候我们不需要修改它,但人是一种喜欢折腾的动物,既然 MapBlazorHub方法的重载也允许我们修改地址,那咱们何不试试。 app.MapBlazorHub("/myapp"); app.MapFallbackToPage(...

  omQ9qq6Upg4c   2023年11月02日   27   0   0 .NET

由于Blazor-WebAssembly是在浏览器中运行的,通常不需要执行服务器代码,只要有个“窝”能托管并提供相关文件的下载即可。所以,当你有一个现成的Blazorwasm项目,没必要用其他语言重写,或者你不想用ASP.NETCore来托管(有些大材小用了),就可以试试用node.js来托管。 要实现这个不需要掌握什么新的知识,所以咱们直接开工干活。 首先,咱们做好Blazorwasm应用的开发。 dotnetnewblazorwasm-empty-nDemo-o. blazorwasm-empty模板创建的项目只带一些基本代码和HelloWorld,没有演示代码——无Counter无假...

  omQ9qq6Upg4c   2023年11月02日   64   0   0 .NET

学习Code总有这样一个过程:入门时候比较依赖设计器、标记语言等辅助工具;等到玩熟练了就会发现纯代码写UI其实更高效。而且,纯代码编写也是最灵活的。WindowsForms项目是肯定可以全代码编写的,哪怕你使用了设计器,它最后也是生成代码文件;而WPF就值得探索一下了。咱们知道,WPF使用XAML标记来构建UI部分。由于XAML扩展了许多功能,用起来自然比HTML舒服。但是,老周向来不喜欢标记语言,这也是我向来不喜欢搞前端的原因。尽管某些前端框架模仿WPF也搞出数据绑定、MVVM、数据模板之类的名堂,也很难说用得特舒服。 有很多中小型项目都会把Web前端部分外包出去,尤其是给私人做——比如一两...

  omQ9qq6Upg4c   2023年11月02日   39   0   0 .NET

上一篇水文中,老周说了一下纯代码编写WPF的大概过程。不过,还是不够的,本篇水文中咱们还要更进一步。 XAML文件默认是作为资源打包进程序中的,而纯代码编写又导致一些常改动的东西变成硬编码了。为了取得二者平衡,咱们还要把一些经常修改的东西放到XAML文件中,不过XAML文件不编译进程序里,而是放到外部,运行阶段加载。比如一些对象属性、画刷、样式、字体之类的,直接改文件保存就行,修改之后不用重新编译项目。 要在运行阶段加载XAML,咱们只需认识一个类就OK—— XamlReader,调用它的Load方法就能从XAML文件加载对象了。 下面老周就边演示边唠叨一下相关的问题。 一、新建项目...

  omQ9qq6Upg4c   2023年11月02日   37   0   0 .NET

这一次咱们来探究一下怎么用纯代码写WPF模板。模板有个共同基类 FrameworkTemplate,数据模板、控件模板等是从此类派生的,因此,该类已定义了一些通用成员。 用代码构建模板,重要的成员是 VisualTree属性,它的类型是 FrameworkElementFactory。可见,模板不是直接创建可视化对象,而是通过一个工厂类来实例化。毕竟用于模板的可视化树是在用到时才创建的。 这么看来,对于控件、常见元素,用XAML和用纯代码写差不多,而模板用代码写就复杂一些。所以,比较好的方法是把控件样式、模板都放到外部的XAML文件中,再在程序中加载(就像老周上一...

  omQ9qq6Upg4c   2023年11月02日   35   0   0 .NET

假设有以下两个实体: publicclassStudent { publicintStuID{get;set;} publicstring?Name{get;set;} publicIEnumerable<Homework>?Homeworks{get;set;} } publicclassHomework { publicstring?Class{get;set;} publicstring?Subject{get;set;} } Homework类表示家庭作业,它并不是独立使用的,而是与学生类(Student)有依赖关系。一位学生有多个家庭作业记录,即Homework对象...

  omQ9qq6Upg4c   2023年11月02日   20   0   0 .NET

上次老周扯了有关主、从实体的话题,本篇咱们再挖一下,主、从实体之间建立的关系,跟咱们常用的一对一、一对多这些关系之间有什么不同。 先看看咱们从学习数据库开始就特熟悉的常用关系——多对多、一对一、一对多说起。数据实体之间会建立什么样的关系,并不是规则性的,而是要看数据的功能。比如你家养的狗狗和水果(你家狗狗可能不吃水果,但老周养的动物基本是什么都吃的,因为从它们幼年起,老周就训练它们,对食物要来者不拒,就算哪天它们不想跟着老周混,出去流浪也不会饿死,适应性更强)。 假设: 1、你的数据是以狗狗为主,那么一条狗狗会吃多种水果。即狗狗对水果是一对多; 2、你的数据以水果为主,每种水果单独记录,然后在...

  omQ9qq6Upg4c   2023年11月02日   30   0   0 .NET

经过版本更新,MiniAPI的功能逐步完善,早期支持得不太好的miniAPI现在许多特性都可以用了,比如灰常重要的依赖注入。 咱们先来个相当简单的注入测试。来,定义一个服务类,为了偷懒,老周这里就不使用接口+实现类的方式了。 publicclassMyService:IDisposable { publicMyService() { Console.WriteLine($"{nameof(MyService)}隆重开业"); } publicvoidDispose() { Console.WriteLine($"{nameof(MyService)}即将散伙"); } publicvoi...

  omQ9qq6Upg4c   2023年11月01日   46   0   0 .NET
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~