文章目录
Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思
Qt (高仿Visio)流程图组件开发(二) 基本图元绘制 图元间连线绘制
Qt (高仿Visio)流程图组件开发(三) 图元基类如何定义,流程图多种图元类型实现
Qt (高仿Visio)流程图组件开发(四) 流程图 图元对齐 磁吸线功能
Qt (高仿Visio)流程图组件开发(五) 流程图 双击编辑图元内容实现
Qt (高仿Visio)流程图组件开发(六) 流程图 线图元 如何绘制曲线 连接线移除视口后无法显示
Qt (高仿Visio)流程图组件开发(七) 流程图 简单操作界面搭建
Qt (高仿Visio)流程图组件开发(八) 流程图 鼠标拖动图元到场景(QGraphicsScene)创建
Qt (高仿Visio)流程图组件开发(九) 流程图 代码展示
使用过Visio的都清楚,其图元可以通过拖动的方式创建到场景中。从QT的视角来开就是把一个图元对象从一个QWidget控件拖动创建到场景中,这里使用QDrag类进行实现。
1、拖放是用户在应用程序中复制或移动数据的一种直观方式,并且在许多桌面环境中用作在应用程序之间复制数据的机制。
2、Qt中的拖放支持以QDrag类为中心,此类处理拖放操作的大多数细节。
3、通过拖放操作要传输的数据包含在QMimeData对象中。 通过setMimeData()指定:
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setText(commentEdit->toPlainText());
drag->setMimeData(mimeData);
4、setMimeData()将QMimeData对象的所有权分配给QDrag对象。必须在具有父QObject的堆上构造QDrag,以确保Qt在完成拖放操作后可以清理。
5、可以使用source()和target()找到源和目标小部件。这些功能通常用于确定拖放操作是否在同一窗口小部件上开始和结束,以便可以实现特殊行为。
该部分内容主要借鉴https://blog.csdn.net/kenfan1647/article/details/116089249,需要更清晰的学习使用,可以参考该博客。
点击按钮发送创建图元数据。
void FlowCharToolSideBar::FlowButtonSlot()
{
QDrag *drag = new QDrag(this);
QMimeData *data = new QMimeData();
data->clear();
QPushButton *clicked_btn = (QPushButton*)sender();
if (clicked_btn == vec_btn_["流程"]){
data->setText(QStringLiteral("流程"));
}
else if (clicked_btn == vec_btn_["判定"]){
data->setText(QStringLiteral("判定"));
}
else if (clicked_btn == vec_btn_["自循环"]){
data->setText(QStringLiteral("自循环"));
}
drag->setMimeData(data);
drag->exec(Qt::MoveAction);
}
接收图元数据并创建。
void FlowchartScene::dragEnterEvent(QGraphicsSceneDragDropEvent* event)
{
// ! [1] 判断是否接收数据
if (event->source() == widget_) {
event->ignore();
return QGraphicsScene::dragEnterEvent(event);
}
flow_item_temp_ = nullptr;
event->accept();
}
void FlowchartScene::dragMoveEvent(QGraphicsSceneDragDropEvent* event)
{
if (flow_item_temp_ == nullptr) {
// ! [1] 创建对应图元类型
QString item_type = event->mimeData()->text();
FlowchartInforBase* item_infor = new FlowchartInforBase();
if (item_type.compare(QStringLiteral("流程")) == 0)
{
item_infor->item_content_.content_ = QStringLiteral("算法流程");
flow_item_temp_ = AddChildItem(item_infor, ItemType::Rect);
}
if (item_type.compare(QStringLiteral("判定")) == 0)
{
item_infor->item_content_.content_ = QStringLiteral("判定");
flow_item_temp_ = AddChildItem(item_infor, ItemType::Condition);
}
if (item_type.compare(QStringLiteral("自循环")) == 0)
{
item_infor->item_content_.content_ = QStringLiteral("自循环");
flow_item_temp_ = AddChildItem(item_infor, ItemType::Circulation);
}
}
if (flow_item_temp_ == nullptr)
return;
FlowToQGraph(flow_item_temp_)->setPos(event->scenePos().toPoint());
}
void FlowchartScene::dragLeaveEvent(QGraphicsSceneDragDropEvent* event)
{
if (flow_item_temp_ != nullptr)
{
QGraphicsItem* item = FlowToQGraph(flow_item_temp_);
this->removeItem(item);
delete item;
item = nullptr;
}
}
void FlowchartScene::dropEvent(QGraphicsSceneDragDropEvent* event)
{
if (event->source() == widget_) {
event->ignore();
return QGraphicsScene::dragEnterEvent(event);
}
flow_item_temp_ = nullptr;
event->acceptProposedAction();
}
本文为优化实现,酌情取用。
本文只是经验分享,描述内容并不绝对,如有误差欢迎指正。
如果此文帮助到你( •̀ ω •́ )✧,动动小手点个赞可好O(∩_∩)O。
原创文章,转载请标明本文出处。我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl