精华内容
下载资源
问答
  • c++交互界面设计
    千次阅读
    2021-02-14 12:00:32

    想利用C或C++做界面设计,怎么做?

    方法步骤如下:

    1、首先打开计算机在,在计算机内打开打开QtCreator,新建一个qt工程。

    2、工程建立完毕,bai代码编辑界面出现,先不管代码。双击左侧的dialog.ui,将会打开图形界面编辑器界面。

    3、可以看到左侧有很多控件,中间就是程序运行时显示的窗口,右侧是对象窗口和属性窗口。其实,图形界面编辑器有一个独立的软件,叫做qt designer,是专门用来编辑图形资源的。实际上,编辑完成的图形界面是一个纯文本的xml文件,其实还有很多类似的图形界面编辑器。Qt集成开发环境会将我们编辑的图形界面xml文件转换成可编译的c++代码。

    相关文章;http://www.xdy666.com/

    4、下面我们在中间的窗口中拖入一个按钮,一个文本框。左键按住Push Button和Line Edit不放,拖到界面上即可。

    5、要注意按钮和文本框的objectName,在编写代码时要用到。

    6、将窗口调整下,让窗口大小合适,按钮和文本框能够对齐,并且能够随窗口的变化而变化。

    7、先点击窗口空白的地方,再点击上方工具栏上的水平布局按钮。然后将窗口调整到合适大小,来看看效果。

    8、点击菜单栏的工具Form Editor预览,来看看实际运行时窗口的效果。这只是外观效果,下面我们来添加一点代码。

    9、在按钮上右键,点击转到槽。

    10、然后再双击clicked(),将转到代码编辑页面。

    11、在代码编辑页面添加如下代码:QMessageBox::information(this,“图形界面”,ui->lineEdit->text());注意在顶部添加#include 。

    12、最后点击运行按钮即可。
    参考文章:
    http://www.jieba8.com/

    更多相关内容
  • c++写出带交互界面的简单计算器

    千次阅读 多人点赞 2020-05-21 15:53:59
    利用devc++和QT写交互界面的计算器 一.先下载一个QT 下载地址 http://download.qt.io/archive/qt/ 我下载的是 5.12.8 版本的 第四个是windos的 第五个是mac的 第六个是linux的 按需下载就行了 这里有一篇下载安装...

    利用devc++和QT写交互界面的计算器

    一.先下载一个QT

    下载地址
    http://download.qt.io/archive/qt/
    我下载的是 5.12.8 版本的
    在这里插入图片描述
    第四个是windos的
    第五个是mac的
    第六个是linux的
    按需下载就行了

    这里有一篇下载安装教程可以看看
    https://blog.csdn.net/cfan927/article/details/98115783?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5&depth_1-utm_source=distribute.pc_releva
    (转@Cfan927)
    比较详细

    二. 学习Qt

    b站有个教学视频,可以先看看,他讲的比较详细
    https://www.bilibili.com/video/BV1g4411H78N
    我个人感觉看到 P10 就行了,因为我知道看我这篇文章的多半都是合工大的孩子被数据结构作业逼疯才来的,先学这么多
    弄懂怎么实现按钮的操作,弄懂什么是信号,什么是槽就可以了

    三.实现计算器代码

    有两点可能要注意一下(没有这个大作业的可以不看后面这段)
    我们的大作业里面有&& || !三种逻辑运算符
    !问题不大
    主要是&&和||
    这个到时候在计算器输入的时候要输入两个&&
    但是我们只入栈一个& 这样方便后面运算
    那怎么实现呢?
    我们用a来代表你的输入的算式
    a[i]遍历这个式子,当 i 指向第一个&时,i++
    再入栈运算符,这样就只入栈了一个运算符

    || 和上面的处理方式一样
    但是要注意的时 | 的ascii码是 124 ,判断运算符和数字时要注意

    其次要注意&& || !之间的优先级,还有运算联系等

    else if(a[i]=='&')
    			{
    			    if(a[i+1]=='&')
    			    	i++;
    			}
    

    类似于上面这样的代码来让它判断

    下面放上源码

    #include<iostream>
    #include<string>
    #include<cmath>
    #include<stack>
    using namespace std;
    
    int symbol(char c)             //赋予优先级
    {
    	switch (c)
    	{
    	case '#': return 0;
    	case '+': return 2;
    	case '-': return 2;
    	case '*': return 3;
    	case '/': return 3;
    	case '(': return 6;
    	case ')': return 1;
    	case '&': return 4;
    	case '|': return 4;
    	case '!': return 5;
    	default: break;
    	}
    	return 0;
    }
    
    double jisuan( char c='#',double b=1,double a=1)
    {
    	switch (c)
    	{
    	case '+': return b + a;
    	case '-': return b - a;
    	case '*': return b * a;
    	case '/': return b / a;
    	case '&': if(a!=0&&b!=0)  return 1;
    	          else          return 0;
        case '|': if(a==0&&b==0) return 0;
                  else           return 1;
    	default: break;
    	}
    	return 0;
    }
    
    double js(double a)
    {
    	if(a==0)  return 1;
    	else      return 0;
    }
    
    int main()
    {
    	stack<double>s1;
    	stack<char>s2;
    	string a;
    	cout << "请输入" << endl;
    	cin >> a;
    	a = a + '#';
    	s2.push('#');
        for (int i = 0;i<a.size(); i++)
    	{
    		if (a[i] <= 47||a[i]==124)                  //用阿斯克码判断扫描到的是数字还是运算符
    		{
    			if (a[i] == '#'&&s2.top() == '#') break; //两个#碰到一起运算结束
    			if (s2.top() == '(')   //括号特殊讨论
    			{
    				if (a[i] == ')')
    				{
    					s2.pop();
    					continue;
    				}
    				s2.push(a[i]);
    				continue;
    			} 
    			else if(a[i]=='&')
    			{
    			    if(a[i+1]=='&')
    			    {
    			    	i++;
    				}
    			}
    			else if(a[i]=='|')
    			{
    				if(a[i+1]=='|')
    			    {
    			    	i++;
    				}
    			}
    			if (symbol(s2.top()) >= symbol(a[i])) //判断运算符优先级
    			{
    				if(s2.top()=='!')
    				{
    					double vel=js(s1.top());
    					s1.pop();
    					s2.pop();
    					s1.push(vel);
    					i--;
    				}
    				else 
    				{
    					char temp1 = s2.top();
    				    s2.pop();
    				    double temp2 = s1.top();
    				    s1.pop();
    				    double temp3 = s1.top();
    				    s1.pop();
    				    s1.push(jisuan(temp1, temp3, temp2));
    				    i--;//要把a[i]再走一遍 不然同级运算a[i]不能push 
    				    continue;
    				}
    			}
    			else
    			{
    				s2.push(a[i]);
    				continue;
    			}
    		}
            else                     //对数字的运算
    		{
    			double sum = static_cast<int>(a[i]) - 48;
    			for (; a[i + 1] > 47&& a[ i + 1 ] != 124 ; i++)     //实现多位数的运算
    				sum = sum * 10 + static_cast<int>(a[i + 1]) - 48;
    			if(static_cast<int>(a[i+1])==46)    //计算小数
    			{
    			    int j=1;
    			    i=i+2;
    				for(;a[i]>47&&a[ i ] != 124;i++)
    				{
    					sum=sum+pow(10,-j)*(static_cast<int>(a[i]) - 48);
    					j++;
    				}
    				i--;
    			} 
    			s1.push(sum);
    		}
    	}
    	double result = s1.top();
    	cout << "计算结果:" << endl;
    	cout << result ;
    }
    
    

    四.实现QT代码

    1. 创立一个widge类型的项目
    在这里插入图片描述
    注意这里把那个Generate form 勾选上,方便后面设计界面

    在这里插入图片描述
    创建好以后就是这样 注意左上角那个板块 要有这几个文件夹

    如果没有那就把QT关了 然后点开刚刚创立的路径的文件夹 把那个文件打开
    再打开QT
    出现如下页面
    点击右下方的按钮就好了
    如果这还没好,那就说明可能你的QT没有下载完整 有的插件没下
    重新下吧

    在这里插入图片描述

    2.开始写代码

    2.1 首先我们要想一个问题 如何把计算器按钮上面输入的式子和自己的计算器源码连接起来

    我们可以创立一个 QString 类型的字符串 s (QT的头文件一般都是QString,QStack什么的)
    每输入一个字符,就把他加入到 s 中
    这样最后再把 s 传入你的源码中,进行后面的计算
    那他的结果我们也可以用一个QString 类型来记录,我们记为 res
    我们再来想一个问题
    那个教学视频中也说到过
    QT中 widget是一个类,他有头文件,我们想要 s 再每一次按下按钮后都记录
    所以我们就可以把 s 定为这个类的私有 ,res 也一样

    在widget.h文件中就有这样一段代码

    private:
        Ui::Widget *ui;
    
        QString s;
        QString res;
    

    在widget.cpp文件中的构造函数对它们初始化

    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
        s="";            //初始化
        res="";          //初始化
        setWindowTitle("肝到昏天黑地的计算器");    //这是个改变界面名称的函数
    }
    

    2.2 我们现在可以来编辑界面了

    点开在这里插入图片描述这个文件
    我们就进入了设计界面
    在这里插入图片描述
    这是我已经设计好的 注意背景图 (我是男生,这不是我的自拍)
    背景图有个链接 讲的也很清楚 https://blog.csdn.net/nb_zsy/article/details/104136793
    上面两个白框框 我选择的是 TextEdit,在左边的工具栏能找到
    按钮选择的是PUsh button
    鼠标选中以后 拖过来就好了
    (b站视频按钮是自己输入坐标的,这里的ui直接是自己选位置,方便了很多,这就是在创立新项目时让你们勾选那个Generate form 的原因)

    2.3 开始实现按钮

    鼠标放到你的按钮上 点击右键
    有个 转到槽 的选项
    之后选择clicked 这就是点击的信号
    点一下之后就跳到了代码页面
    之后就在这个函数里面实现你的按钮就可以了

    这里我们举一个例子

    void Widget::on_pushButton_clicked()
    {
         s+="1";
         ui->textEdit->setText(s);
    }
    

    s前面解释过了
    ui就是你这个设计页面,textedit就是第一个白框框,setText(s)就是在这个白框框里面输入s
    在这里插入图片描述
    那么这个连起来的意思就是
    在你的设计页面中的 textEdi t这个对象中输入 s
    具体怎么看对象名,在设计页面,点击你的按钮或者文本框,右上角有显示他的对象名

    再说三个特殊的
    ①后退键 :

    void Widget::on_pushButton_20_clicked()
    {
        s=s.left(s.length()-1);
        ui->textEdit->setText(s);
    }
    

    ②清除键 :

    void Widget::on_pushButton_19_clicked()
    {
        s="";
        res="";
        ui->textEdit->setText(s);
        ui->textEdit_2->setText(res);
    }
    

    res是在第二个文本框中的字符串

    ③ 等号键 :
    下面 “= ”的按钮是个特例
    我们有两种想法
    第一就是直接把你的计算器源码整个放在这个槽函数里面
    也可以在外面单独写一个函数,最后return一个值,把这个值传入 = 的槽函数

    但是值得注意的有两点
    第一
    如果你的计算器源码其中一个栈是char类型的,而你的s又是string类型,这样是过不了QT的编译器的
    因此要把string转成char型

    char *a=s.toLocal8Bit().data();
    

    第二
    最后传到设计界面的文本框中的数据应该是Qstring类型
    如果你最后的计算结果是 int 或者 double 类型的
    要把它转成Qstring的

        double num = s1.top();
        res = QString::number(num);
        ui->textEdit_2->setText(res);
    

    num是我的最后计算结果
    textEdit_2是我的第二个文本框的对象名

    到现在我们的计算器基本上就完成了
    还有两点也要注意一下
    第一就是我们在写槽函数的时候 输入文本框的字符一定时英文键盘下的字符,不然程序不会进行的
    第二就是QT有的错误不会报错,只会警告,尽量把所有的警告也改了,有的警告不影响结果,有的警告会让最后的程序异常关闭,虽然能编译通过
    上面两条都是我血的教训,好几个小时看不出到底是那错了,程序一直异常关闭

    我能说的也就这么多了,如果还有什么问题可以发在下面
    ****有一种营销号的感觉 ****

    我的这个计算器的文件在这里
    https://gitee.com/jinhesuannaijiaofu/jisuanqi
    进去下载那个计算器的文件就好了
    下载完成以后用QT打开就OK了
    要是看主要部分的代码的话,点开untit 文件里面的widget.cpp文件就行
    不用下载就能看

    如果能点个赞就更好了!!!

    展开全文
  • QML与C++交互:登陆界面设计

    万次阅读 多人点赞 2014-05-14 10:12:02
    QML与C++交互:登陆界面设计 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5.2.1 说明: QML设计前台界面,C++后台负责逻辑 效果图: 源代码...

    QML与C++交互:登陆界面设计


    本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


    环境:

    主机:WIN7

    开发环境:Qt5.2.1


    说明:

    QML设计前台界面,C++后台负责逻辑


    效果图:




    源代码:


    前台qml文件

    login.qml

    /*********************************************************************
    *                            登陆界面qml文件
    *                       (c)copyright 2014,jdh
    *                         All Right Reserved
    *新建日期:2014/4/29 by jdh
    *修改日期:2014/4/30 by jdh
    *修改日期:2014/5/4 by jdh
    *修改日期:2014/5/5 by jdh
    **********************************************************************/
    
    import QtQuick 2.0
    import "content"
    import Login_Gui 1.0
    
    Rectangle
    {
        id: login
        width: 320; height: 512
        SystemPalette { id: activePalette }
    
        //C++组件:用户界面
        Login_Gui
        {
            id:login_gui
            onSig_login_result:
            {
                //关闭登陆动画
                load_gif.opacity = 0
    
                //根据登陆结果处理
                switch (result)
                {
                //登陆成功
                case 0:
                    message.text = "登陆成功"
                    message.opacity = 1
                    break;
                //无此用户名
                case 1:
                    message.text = "登陆失败:无此用户名"
                    message.opacity = 1
                    break;
                //密码错误
                case 2:
                    message.text = "登陆失败:密码错误"
                    message.opacity = 1
                    break;
                //达到最大登陆次数
                case 3:
                    message.text = "登陆失败:达到最大登陆次数"
                    message.opacity = 1
                    break;
                }
            }
        }
    
        //背景图片
        Image
        {
            id: background
            anchors { top: parent.top; bottom: parent.bottom }
            anchors.fill: parent
            source: "pics/pic1.png"
            fillMode: Image.PreserveAspectCrop
        }
    
        //消息框
        Message
        {
            id: message
            font_size: login.height * 0.03
            anchors {centerIn: parent}
            opacity: 0
        }
    
        //登陆动画
        AnimatedImage
        {
            id: load_gif; source: "pics/load.gif"
            anchors {horizontalCenter: parent.horizontalCenter; verticalCenter: parent.verticalCenter}
            z: 100
            opacity: 0
        }
    
        //顶栏
        Item
        {
            id: top_bar
            width: login.width; height: login.height * 0.06
            anchors.top: parent.top
    
            Text
            {
                id: title
                anchors { top: parent.top; horizontalCenter: parent.horizontalCenter }
                //text: "登陆"
                text: "登陆"
                font.bold: true
                font.pointSize: login.height * 0.06 * 0.4
                color: "dark red"
            }
        }
    
        //空白栏
        Item
        {
            id: space1
            width: login.width; height: login.height * 0.1
            anchors.top: top_bar.bottom
        }
    
        //登陆框
        Rectangle
        {
            id: rect1
            width: login.width * 0.8; height: login.height * 0.3
            anchors { top: space1.bottom; horizontalCenter: parent.horizontalCenter }
            border.color: "#707070"
            color: "transparent"
            radius: 8
    
            Row
            {
                spacing: rect1.width * 0.05
    
                Item
                {
                    width: rect1.width * 0.05; height: rect1.height
                }
    
                Column
                {
                    spacing: rect1.height * 0.025
    
                    Item
                    {
                        width: rect1.width * 0.8; height: rect1.height * 0.05
                    }
    
                    LineInput
                    {
                        id: txt_user_id
                        width: rect1.width * 0.8; height: rect1.height * 0.2
                        font_size:height * 0.7
                        //anchors {horizontalCenter: rect1.horizontalCenter; top: rect1.top; topMargin: 8}
                        hint: "请输入用户号"
                        text:login_gui.user_id
                    }
    
                    LineInput
                    {
                        id: txt_password
                        width: rect1.width * 0.8; height: rect1.height * 0.2
                        font_size:height * 0.7
                        //anchors {horizontalCenter: rect1.horizontalCenter; bottom: btn_login.top;  bottomMargin: rect1.height * 0.1}
                        hint: "请输入密码"
                        text:login_gui.password
                    }
    
                    Row
                    {
                        spacing: rect1.width * 0.1
                        Button
                        {
                            id: btn_login
                            width: rect1.width * 0.35; height: rect1.height * 0.2
                            //anchors { left: rect1.left; leftMargin: 28; bottom: rect1.bottom; bottomMargin: 8 }
                            text: "登陆"
                            onClicked: login_req()
                        }
    
                        Button
                        {
                            id: btn_quit
                            width: rect1.width * 0.35; height: rect1.height * 0.2
                            //anchors { right: rect1.right; rightMargin: 28; bottom: rect1.bottom; bottomMargin: 8 }
                            text: "退出"
                            onClicked:
                            {
                                Qt.quit();
                            }
                        }
                    }
    
                    Row
                    {
                        spacing: rect1.width * 0.1
    
                        CheckBox
                        {
                            id: check1
                            width: rect1.width * 0.35; height: rect1.height * 0.2
                            //anchors { left: rect1.left; top: rect1.bottom }
                            caption: "记住密码"
                            selected: login_gui.flag_remember
                        }
    
                        CheckBox
                        {
                            id: check2
                            width: rect1.width * 0.35; height: rect1.height * 0.2
                            //anchors { right: rect1.right; top: rect1.bottom }
                            caption: "自动登陆"
                            selected: login_gui.flag_auto
                        }
                    }
                }
            }
        }
    
        //android自带键处理
        FocusScope
        {
            focus: true
    
            Keys.onReleased:
            {
                if (event.key == Qt.Key_Back)
                {
                    console.log("qml login quit")
                    login.sig_btn_quit()
                }
            }
        }
    
        //登陆请求函数
        function login_req()
        {
            //判断用户名是否有效
            if (txt_user_id.text == "")
            {
                message.text = "请输入用户名"
                message.opacity = 1
                return
            }
    
            //判断密码是否有效
            if (txt_password.text == "")
            {
                message.text = "请输入密码"
                message.opacity = 1
                return
            }
    
            //显示登陆动画
            load_gif.opacity = 1
    
            //登陆请求
            login_gui.user_id = txt_user_id.text
            login_gui.password = txt_password.text
            login_gui.flag_remember = check1.selected
            login_gui.flag_auto = check2.selected
            login_gui.slot_login_req()
        }
    
    //    //信号槽绑定
    //    Component.onCompleted:
    //    {
    //        login_gui.sig_user_id_changed.connect(login_gui.slot_btn_login)
    //    }
    }
    

    后台C++代码

    main.c

    /*********************************************************************
    *                               主文件
    *                       (c)copyright 2014,jdh
    *                         All Right Reserved
    *新建日期:2014/1/27 by jdh
    *修改日期:2014/1/28 by jdh
    *修改日期:2014/2/4 by jdh
    *修改日期:2014/2/18 by jdh
    *修改日期:2014/2/27 by jdh
    *修改日期:2014/2/28 by jdh
    *修改日期:2014/3/1 by jdh
    *修改日期:2014/4/10 by jdh
    *修改日期:2014/5/4 by jdh
    **********************************************************************/
    
    #include "world.h"
    #include "main_gui.h"
    #include "login_gui.h"
    #include "light_gui.h"
    #include "heart_beat.h"
    #include "net.h"
    #include "data_sync_center.h"
    #include "set_ctrl_state.h"
    
    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        //注册组件到QML
        qmlRegisterType<Login_Gui>("Login_Gui", 1, 0, "Login_Gui");
    
        QtQuick2ApplicationViewer viewer;
        viewer.setMainQmlFile(QStringLiteral("qml/SH_User/login.qml"));
        viewer.showExpanded();
    
        return app.exec();
    }
    

    login_gui.h

    /*********************************************************************
    *                           登陆界面模块头文件
    *                       (c)copyright 2014,jdh
    *                         All Right Reserved
    *新建日期:2014/1/29 by jdh
    *修改日期:2014/2/1 by jdh
    *修改日期:2014/2/18 by jdh
    *修改日期:2014/3/18 by jdh
    *修改日期:2014/5/4 by jdh
    *修改日期:2014/5/5 by jdh
    *修改日期:2014/5/13 by jdh
    **********************************************************************/
    
    #ifndef LOGIN_GUI_H
    #define LOGIN_GUI_H
    
    /*********************************************************************
    *                               头文件
    **********************************************************************/
    
    #include "world.h"
    
    /*********************************************************************
    *                               宏定义
    **********************************************************************/
    
    /*********************************************************************
    *                               登录间隔
    *单位:ms
    **********************************************************************/
    
    #define INTERVAL_LOGIN          500
    
    /*********************************************************************
    *                               最大登录次数
    **********************************************************************/
    
    #define NUM_LOGIN               5
    
    /*********************************************************************
    *                               数据结构
    **********************************************************************/
    
    /*********************************************************************
    *                               登录界面类
    **********************************************************************/
    
    class Login_Gui : public QObject
    {
        Q_OBJECT
    
        //属性:用户名
        Q_PROPERTY(QString user_id READ user_id WRITE set_user_id NOTIFY sig_user_id_changed)
        //属性:密码
        Q_PROPERTY(QString password READ password WRITE set_password NOTIFY sig_password_changed)
        //属性:记住密码标志
        Q_PROPERTY(bool flag_remember READ flag_remember \
                   WRITE set_flag_remember NOTIFY sig_flag_remember_changed)
        //属性:自动登录标志
        Q_PROPERTY(bool flag_auto READ flag_auto \
                   WRITE set_flag_auto NOTIFY sig_flag_auto_changed)
    
    public:
    
        /*********************************************************************
        *                           函数
        **********************************************************************/
    
        /*********************************************************************
        *                           初始化函数
        **********************************************************************/
    
        Login_Gui();
    
        /*********************************************************************
        *                           解构函数
        **********************************************************************/
    
        ~Login_Gui();
    
        /*********************************************************************
        *                           属性读取:用户号
        **********************************************************************/
    
        QString user_id();
    
        /*********************************************************************
        *                           属性写入:用户号
        **********************************************************************/
    
        void set_user_id(QString str);
    
        /*********************************************************************
        *                           属性读取:密码
        **********************************************************************/
    
        QString password();
    
        /*********************************************************************
        *                           属性写入:密码
        **********************************************************************/
    
        void set_password(QString str);
    
        /*********************************************************************
        *                           属性读取:记住密码标志
        **********************************************************************/
    
        bool flag_remember();
    
        /*********************************************************************
        *                           属性写入:记住密码标志
        **********************************************************************/
    
        void set_flag_remember(bool flag);
    
        /*********************************************************************
        *                           属性读取:自动登陆标志
        **********************************************************************/
    
        bool flag_auto();
    
        /*********************************************************************
        *                           属性写入:自动登陆标志
        **********************************************************************/
    
        void set_flag_auto(bool flag);
    
    signals:
    
        /*********************************************************************
        *                           属性改变信号:用户号
        **********************************************************************/
    
        void sig_user_id_changed();
    
        /*********************************************************************
        *                           属性改变信号:密码
        **********************************************************************/
    
        void sig_password_changed();
    
        /*********************************************************************
        *                           属性改变信号:记住密码标志
        **********************************************************************/
    
        void sig_flag_remember_changed();
    
        /*********************************************************************
        *                           属性改变信号:自动登陆标志
        **********************************************************************/
    
        void sig_flag_auto_changed();
    
        /*********************************************************************
        *                           信号:登陆结果
        *参数:result:0:成功
        *           1:无此用户名
        *           2:密码错误
        *           3:达到登陆的最大次数
        **********************************************************************/
    
        void sig_login_result(int result);
    
        /*********************************************************************
        *                               发送网络帧
        *参数:id:用户名
        *    password:密码
        *    cmd:帧命令
        *    index:发送序列号
        *    frame:发送的报文
        **********************************************************************/
    
        void sig_net_tx_frame_with_id(uint32_t id,uint32_t password,int cmd,uint16_t index,QByteArray frame);
    
    public slots:
    
        /*********************************************************************
        *                           槽函数:登陆请求
        **********************************************************************/
    
        void slot_login_req();
    
        /*********************************************************************
        *                           槽函数:登陆响应
        *参数:data:接收的数据
        **********************************************************************/
    
        void slot_login_ack(QByteArray data);
    
    private slots:
    
        /*********************************************************************
        *                           槽函数:心跳滴答函数
        *说明:1滴答触发1次
        **********************************************************************/
    
        void slot_tick();
    
    private:
    
        /*********************************************************************
        *                           变量
        **********************************************************************/
    
        /*********************************************************************
        *                           属性:用户号
        **********************************************************************/
    
        QString _user_id;
    
        /*********************************************************************
        *                           属性:密码
        **********************************************************************/
    
        QString _password;
    
        /*********************************************************************
        *                           属性:记住密码标志
        **********************************************************************/
    
        bool _flag_remember;
    
        /*********************************************************************
        *                           属性:自动登录标志
        **********************************************************************/
    
        bool _flag_auto;
    
        /*********************************************************************
        *                           滴答定时器
        **********************************************************************/
    
        QTimer *timer;
    
        /*********************************************************************
        *                           登录计数器
        **********************************************************************/
    
        int Login_Counter;
    };
    
    #endif // LOGIN_GUI_H
    

    login_gui.c

    /*********************************************************************
    *                           登陆界面模块主文件
    *                       (c)copyright 2014,jdh
    *                         All Right Reserved
    *新建日期:2014/1/29 by jdh
    *修改日期:2014/2/1 by jdh
    *修改日期:2014/2/17 by jdh
    *修改日期:2014/2/18 by jdh
    *修改日期:2014/2/16 by jdh
    *修改日期:2014/5/4 by jdh
    *修改日期:2014/5/5 by jdh
    *修改日期:2014/5/13 by jdh
    **********************************************************************/
    
    /*********************************************************************
    *                           头文件
    **********************************************************************/
    
    #include "login_gui.h"
    
    /*********************************************************************
    *                           函数
    **********************************************************************/
    
    /*********************************************************************
    *                           初始化函数
    **********************************************************************/
    
    Login_Gui::Login_Gui()
    {
        //初始化变量
        Login_Counter = 0;
    
        //滴答初始化
        timer = new QTimer(this);
        //绑定信号槽
        connect(timer, SIGNAL (timeout()), this , SLOT(slot_tick()));
    
        QFile file_cfg("cfg.txt");
        QByteArray arr;
        bool ok;
        int flag_remember = 0;
        int flag_auto_login = 0;
        int id = 0;
        int password = 0;
        QString str;
        int i = 0;
        int j = 0;
    
        //属性初始化
        _user_id = "";
        _password = "";
        _flag_remember = false;
        _flag_auto = false;
    
        //判断文件是否存在
        if (!file_cfg.exists())
        {
            file_cfg.close();
        }
        else
        {
            //文件存在
            file_cfg.open(QIODevice::ReadOnly);
            //读取文件
            do
            {
                str.clear();
                arr = file_cfg.readLine();
                for (i = 0;i < arr.count();i++)
                {
                    if ((arr.at(i) >= '0' && arr.at(i) <= '9') || \
                        (arr.at(i) >= 'a' && arr.at(i) <= 'f') || \
                         arr.at(i) == 'x')
                    {
                        str[j++] = arr.at(i);
                    }
                }
                flag_remember = str.toInt(&ok,16);
                if (!ok)
                {
                    break;
                }
    
                str.clear();
                arr = file_cfg.readLine();
                for (i = 0;i < arr.count();i++)
                {
                    if ((arr.at(i) >= '0' && arr.at(i) <= '9') || \
                        (arr.at(i) >= 'a' && arr.at(i) <= 'f') || \
                         arr.at(i) == 'x')
                    {
                        str[j++] = arr.at(i);
                    }
                }
                flag_auto_login = str.toInt(&ok,16);
                if (!ok)
                {
                    break;
                }
    
                str.clear();
                arr = file_cfg.readLine();
                for (i = 0;i < arr.count();i++)
                {
                    if ((arr.at(i) >= '0' && arr.at(i) <= '9') || \
                        (arr.at(i) >= 'a' && arr.at(i) <= 'f') || \
                         arr.at(i) == 'x')
                    {
                        str[j++] = arr.at(i);
                    }
                }
                id = str.toInt(&ok,16);
                if (!ok)
                {
                    break;
                }
    
                str.clear();
                arr = file_cfg.readLine();
                for (i = 0;i < arr.count();i++)
                {
                    if ((arr.at(i) >= '0' && arr.at(i) <= '9') || \
                        (arr.at(i) >= 'a' && arr.at(i) <= 'f') || \
                         arr.at(i) == 'x')
                    {
                        str[j++] = arr.at(i);
                    }
                }
                password = str.toInt(&ok,16);
                if (!ok)
                {
                    break;
                }
    
                //判断是否记住密码
                if (flag_remember == VALID_FLAG)
                {
                    _user_id = QString::number(id,10);
                    _password = QString::number(password,10);
                    _flag_remember = true;
    
                    //判断是否自动登录
                    if (flag_auto_login == VALID_FLAG)
                    {
                        _flag_auto = true;
                        slot_login_req();
                    }
                }
            } while (0);
    
            file_cfg.close();
        }
    }
    
    /*********************************************************************
    *                           解构函数
    **********************************************************************/
    
    Login_Gui::~Login_Gui()
    {
    }
    
    /*********************************************************************
    *                           属性读取:用户号
    **********************************************************************/
    
    QString Login_Gui::user_id()
    {
        return _user_id;
    }
    
    /*********************************************************************
    *                           属性写入:用户号
    **********************************************************************/
    
    void Login_Gui::set_user_id(QString str)
    {
        if (_user_id != str)
        {
            _user_id = str;
            emit sig_user_id_changed();
        }
    }
    
    /*********************************************************************
    *                           属性读取:密码
    **********************************************************************/
    
    QString Login_Gui::password()
    {
        return _password;
    }
    
    /*********************************************************************
    *                           属性写入:密码
    **********************************************************************/
    
    void Login_Gui::set_password(QString str)
    {
        if (_password != str)
        {
            _password = str;
            emit sig_password_changed();
        }
    }
    
    /*********************************************************************
    *                           属性读取:记住密码标志
    **********************************************************************/
    
    bool Login_Gui::flag_remember()
    {
        return _flag_remember;
    }
    
    /*********************************************************************
    *                           属性写入:记住密码标志
    **********************************************************************/
    
    void Login_Gui::set_flag_remember(bool flag)
    {
        if (_flag_remember != flag)
        {
            _flag_remember = flag;
            emit sig_flag_remember_changed();
        }
    }
    
    /*********************************************************************
    *                           属性读取:自动登陆标志
    **********************************************************************/
    
    bool Login_Gui::flag_auto()
    {
        return _flag_auto;
    }
    
    /*********************************************************************
    *                           属性写入:自动登陆标志
    **********************************************************************/
    
    void Login_Gui::set_flag_auto(bool flag)
    {
        if (_flag_auto != flag)
        {
            _flag_auto = flag;
            emit sig_flag_auto_changed();
        }
    }
    
    /*********************************************************************
    *                           槽函数:登陆请求
    **********************************************************************/
    
    void Login_Gui::slot_login_req()
    {   
        //初始化计数器
        Login_Counter = 0;
        //开始尝试登陆
        timer->start(INTERVAL_LOGIN);
        slot_tick();
    }
    
    /*********************************************************************
    *                           槽函数:登陆响应
    *参数:data:接收的数据
    **********************************************************************/
    
    void Login_Gui::slot_login_ack(QByteArray data)
    {
        uint32_t id = 0;
        uint32_t password = 0;
        int flag_remember = 0;
        int flag_auto_login = 0;
        uint8_t result = 0;
        bool ok;
    
    #ifdef DEBUG
        qDebug() << "接收帧:尝试登陆" << (uint8_t)data[0] << (uint8_t)data[1] << (uint8_t)data[2];
    #endif
    
        //清除计数器
        Login_Counter = 0;
        //停止登录尝试
        timer->stop();
    
        //判断用户号和密码是否匹配
        id = ((uint8_t)data[6] << 24) +\
             ((uint8_t)data[7] << 16) + \
             ((uint8_t)data[8] << 8) + \
              (uint8_t)data[9];
        password = ((uint8_t)data[10] << 24) +\
                   ((uint8_t)data[11] << 16) + \
                   ((uint8_t)data[12] << 8) + \
                    (uint8_t)data[13];
        //登陆结果
        result = (uint8_t)data[LEN_FRAME_HEAD];
        //判断登陆结果
        switch (result)
        {
            //登陆成功
        case 0:
            {
                //判断用户名和密码是否正确
                if (id == (uint32_t)_user_id.toInt(&ok) && password == (uint32_t)_password.toInt(&ok))
                {
                    //发送登陆成功信号
                    emit sig_login_result(0);
    
                #ifdef DEBUG
                    qDebug() << "登陆成功" << "用户号" << _user_id << "密码" << _password;
                #endif
    
                    //判断是否勾选记住密码以及自动登录
                    if (_flag_remember)
                    {
                        flag_remember = VALID_FLAG;
                    }
                    if (_flag_auto)
                    {
                        flag_auto_login = VALID_FLAG;
                    }
    
                    //将用户名密码保存
                    QFile file_cfg("cfg.txt");
                    file_cfg.open(QIODevice::WriteOnly);
                    QTextStream out(&file_cfg);
                    out << QString::number(flag_remember,16) << "\r\n" \
                        << QString::number(flag_auto_login,16) << "\r\n" \
                        << _user_id << "\r\n" \
                        << _password << "\r\n";
                    file_cfg.close();
                }
    
                break;
            }
            //无此用户名
        case 1:
            {
            #ifdef DEBUG
                qDebug() << "登陆失败" << "用户号不存在";
            #endif
    
                //发送登录失败信号
                emit sig_login_result(1);
    
                break;
            }
            //密码错误
        case 2:
            {
            #ifdef DEBUG
                qDebug() << "登陆失败" << "密码错误";
            #endif
    
                //发送登录失败信号
                emit sig_login_result(2);
    
                break;
            }
        }
    }
    
    /*********************************************************************
    *                           槽函数:心跳滴答函数
    *说明:1滴答触发1次
    **********************************************************************/
    
    void Login_Gui::slot_tick()
    {
        QByteArray frame;
        bool ok;
    
        //登录计数器
        Login_Counter++;
        if (Login_Counter > NUM_LOGIN)
        {
        #ifdef DEBUG
            qDebug() << "登录失败" << "达到最大尝试登陆次数:" << NUM_LOGIN;
        #endif
    
            //清除计数器
            Login_Counter = 0;
    
            //停止登陆尝试
            timer->stop();
            //发送登陆失败信号
            emit sig_login_result(3);
    
            return;
        }
    
        //发送登陆请求
        //报文
        frame.clear();
        //发送网络帧
    #ifdef DEBUG
        qDebug() << "发送帧:发送登陆请求";
    #endif
        emit sig_net_tx_frame_with_id((uint32_t)_user_id.toInt(&ok),(uint32_t)_password.toInt(&ok),\
                                      CMD_USER_LOGIN_REQUEST,0,frame);
    }
    





    展开全文
  • C++ 一些界面的编写

    2013-03-04 09:39:04
    C++ 绚丽界面编写
  • QPowerShell 为 Qt C++ 开发人员提供了一种与 Windows PowerShell CLI 交互的简单方法。 它仅在 PS 2.0 上进行过测试,但也应在较新的版本上进行测试。 这是我向公众发布的第一个项目。 请随时提交错误、建议或功能...
  • c++的聊天界面

    2014-05-27 14:54:35
    c++做的一个qq聊天 重庆理工大学 课程设计
  • C++ 界面设计须知

    万次阅读 2017-02-20 17:17:57
    C++界面 1. 如果程序的界面不是太复杂,用 SDK 或 MFC 开发都行。 2. 如果程序对界面的美观要求比较高并且改动比较多,用客户端引擎来做比较好,可以参考C#中的WPF编程。 3. 还有现在很多软件都是客户端嵌...

    C++做界面
    1. 如果程序的界面不是太复杂,用 SDK 或 MFC 开发都行。
    2. 如果程序对界面的美观要求比较高并且改动比较多,用客户端引擎来做比较好,可以参考C#中的WPF编程。
    3. 还有现在很多软件都是客户端嵌浏览器来做界面了,因为网页脚本写界面方便,JS+CSS也利于分工合作。

    MFC 微软基础类库
    图像显示 GDI / D3D / OpenGL

    MFC / QT区别
    1.IDE –> VS / QT Creator
    2.简易–> 复杂 / 易上手
    1、语言本身
    QT:跨平台,语法结构简单清晰。面向对象的特性体现的比MFC明显。代码写起来比较优雅,也就是说上手会快一点。
    MFC:在Windows平台地位毋庸置疑,QT在windows下基本属于非主流了。个人感觉MFC相较于QT是比较杂乱的,你可以看下MFC以及QT的实例代码,直观上就可以了解了。并且要写MFC必须要知道Windows的消息循环机制。而QT开始时并不需要了解Windows底层的东西。

    2、学习资源
    QT:基本上只有官方的官网和demo了,相关的开发论坛比MFC的少很多,毕竟敲MFC的人要多。
    MFC:MSDN资源,对于初学者来说可能MSDN比较枯燥,相关论坛和那种问答的资源要多很多,一般初学者遇到的问题都可以看到前辈们的解决方法。

    3、IDE以及开发配置
    初学者应该是windows,对于MFC,一个Visual Studio就足够了。QT,用QT Creator,配置也不会太麻烦。

    个人建议:QT

    如何进行MFC框架编写窗口程序视频教程?
    http://edu.51cto.com/course/course_id-1779.html
    如何进行MFC数据库编程视频教程?
    http://edu.51cto.com/course/course_id-1770.html

    Qt-介绍与跨平台基本环境搭建(视频)
    http://mooc.guokr.com/career/3582/Qt-介绍与跨平台基本环境搭建/

    QT下载的时候最好下载QT5,因为集成了,安装方便 –> 如下参照Qt 5.4.0 下载和安装
    Qt Creator下载和安装(详细教程)
    http://blog.csdn.net/win_turn/article/details/50465127

    QT Creator的使用可以参照:
    http://blog.csdn.net/win_turn/article/details/50465127(安装QT4的时候捎带讲述了)
    http://blog.csdn.net/clb1609158506/article/details/45014507

    Snack (C实现).Linux下实现的太复杂了~~
    1.数组实现:http://blog.csdn.net/lyh66/article/details/7367561
    2.链表实现:http://blog.csdn.net/huangblog/article/details/8294326

    展开全文
  • 这是人机交互学科的实验报告,我选择的课题是命令行菜单界面
  • matlab人机交互界面设计

    千次阅读 2020-02-28 14:39:01
    再通过switch语句对不同方法进行封装 3、滚动条 类似于opencv中的createTrackerbar 通过 val = get(handles.slider1,'value')获得滑动条的实时数据,滑动条数据范围可通过属性中的max进行设置 其中handles为界面句柄...
  • QML与C++交互

    2020-12-22 17:10:41
    Qt Quick 是一种高级用户界面技术,使用它可轻松地创建供移动和嵌入式...  研究了几天QML,我想编程人员关心的还是QML怎样与C++ Application交互了。发现网上QT中文资料很少,唉,只能参照官网文档:  一、QML引
  • Qt Quick QML 与 C++ 交互系列之一

    万次阅读 多人点赞 2020-10-24 17:44:50
    QML 负责界面C++ 负责逻辑,这也是 Qt 官方推荐的开发方式。那么 QML 与 C++交互必然是每一个Qt开发老师需要掌握并且精通的。 接下来,我们会对QML 与 C++ 交互的几种方式进行详细讲解。我们通过创建项目,...
  • C++之人机交互

    2021-09-07 22:39:07
    最近在跟着菜鸟教程及bilibili上搜的视频学习C++,也已经看了几天了。突然想到还是把自己的学习过程记录一下吧,这样印象会更深一些,也方便后续查询。 main.cpp #include <iostream> #include <string>...
  • python+pyqt5手工编写一个含交互界面的简易词法分析器 @author:x1nge. 编译原理基础实验 基础 在之前的一篇博文中我记录了一个不含...我简单设计交互界面如图所示: 有话说: 这边以C和C++为输入语言,其他语言有
  • Qt官方推荐使用QML构建界面,使用C++实现非界面的业务逻辑和复杂运算,大多数开发者也是基于这样的原则来混合使用QML和C++。因此QML与C++交互必然是我们需要掌握的技能。 此次Webinar将向大家介绍QML与C++交互...
  • 界面要求:程序的界面要友好,便于人机交互,用菜单驱运程序的运行。 功能要求:程序应提供的基本管理功能有: (1)装入:将数据文件中的数据读入程序的数组或结构体数组中。 (2)添加:增加一个对象的记录到数组...
  • C++&QT实现计算器图形界面交互

    千次阅读 2020-05-10 14:49:49
    (1)增加图形交互功能。 (2)增加3个逻辑运算符 &&、||、 !,并能处理逻辑运算符和算术运算符的混合运算。 (3)增加容错功能,能进行异常处理。 说明: (1)其中牵涉到数据结构相关的可复用代码,...
  • 实现了6位和8位的电话号码频谱打印及电话号码的信息反馈
  • qt与C++交互

    千次阅读 2018-05-22 16:41:36
    c++与qml结合开发中,通常需要在qml中使用到C++类实例,这时候就需要在C++中将类注册为qml组建 主要是继承QObject 并且使用Q_PROPERTY将类的私有变量注册为qml组建属性,如果需要在qml中调用c++类中封装的函数,...
  • 交互选择界面(c语言)

    万次阅读 多人点赞 2019-04-09 18:06:36
    选择交互界面         一个交互界面是用户和终端交流的形式。是以用户为中心的设计流程,关注用户的使用流畅度和方便性,符合用户使用习惯的解决方案。交互不一定需要...
  • #define _CRT_SECURE_NO_WARNINGS_ #include<graphics.h> #include<stdio.h> #include<string.h> #include<mmsystem.h> #pragma comment(lib,"winmm.lib") struct button ...
  • c++实现简易计算器,并且利用QT实现图形交互(让你少走弯路,一天搞定计算器课程设计) **前提:**已回计算器代码的实现,如若不会请翻到文章最下方先看懂计算器代码实现; ## 下载QT :(跟着下方链接走,强烈建议...
  • QML入门教程(11) : qml C++交互介绍

    千次阅读 2021-03-20 18:18:46
    qml和C++可以相互调用,可以在qml代码中调用C++的类对象,也可以用C++类来获取qml的控件对象,下面分别介绍这两这种用法 qml调用C++ ​ Qt 提供了两种在 QML 环境中使用 C++对象的方式∶ ​ 方式1:在C+中实现一个类...
  • #基于LabVIEW的WIFI通信人机交互界面设计# 文章目录前言一、LabVIEW简介二、LabVIEW人机交互界面的软件设计三、 LabVIEW人机交互界面测试总结 前言 我们可以使用多种编程软件对实验数据进行处理,比如:C++、...
  • 从设计图形用户界面的框架结构及实现人机交互入手,说明了用C++语言进行图形用户界面设计的相关内容和处理要点,并以具体例程论述了制作图形界面时函数的编写方法。运用MFC进行界面菜单和对话框的设计,为平台实现...
  • QT人机交互(动态界面

    千次阅读 2020-11-23 00:03:13
    QT简单的人机交互界面设计 人机交互-----用户能够与界面进行动态交互 信号和槽:当一个事件发生时,那么一个对应的信号会触发,如果与该信号已建立的连接的槽函数它就会被自动调用。自定义信号并建立连接,槽函数...
  • 【基于C++和C#编程语言在人机交互界面工业领域应用的优缺点分析与研究】 语言 优点 缺点 应用领域 C++ 1.容易调用底层...
  • HALCON:与C++交互

    千次阅读 2018-06-16 08:52:37
    HALCON:与C++交互
  • 它使用一些可视组件以及这些组件之间的交互来描述用户界面。本次测试的例子,是通过点击一个按钮,然后将c++中的数据改变到qml界面中,并且改变字体的颜色。 QML与c++的简单交互,文字说明: 首先在main文件里面...
  • 由于Windows7的广泛...讨论一种门禁控制管理系统的人机交互、操作逻辑、界面美观相关的整体设计,主要内容包含设计原则和编程实现,重点对门禁系统基于Visual C++编程工具和MFC类库的界面框架的实现进行了详细讨论。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,732
精华内容 32,292
关键字:

c++交互界面设计

c++ 订阅