利用QT做一个简易登录注册界面

内容比较简单,这里直接给出源码

QT客户端

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include
#include
#include
#include

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

private slots:
void on_pushButton_2_clicked();
void net_recv();
void on_pushButton_clicked();

private:
Ui::Widget *ui;
QTcpSocket *tcp_socket;
};

#endif // WIDGET_H

代码模块

#include “widget.h”
#include “ui_widget.h”

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
tcp_socket = new QTcpSocket;
/连接服务器/
tcp_socket->connectToHost(“192.168.21.103”,8888);
/关联重要信号//当接收到数据,产生信号,执行net_recv()/
connect(tcp_socket,SIGNAL(readyRead()),this,SLOT(net_recv()));

}

Widget::~Widget()
{
delete ui;
}

void Widget::net_recv()
{
/读取数据/
char buf[512];
memset(buf,0,sizeof(buf));
tcp_socket->read(buf,sizeof(buf));
qDebug() << buf;
QString str = buf;
QMessageBox::about(this,tr(“提示信息”),tr(str.toLatin1()));
}

void Widget::on_pushButton_2_clicked()
{
/注册按钮/

/*发送数据*/
QString str = 'R' + ui->lineEdit_2->text() + '#' + ui->lineEdit->text();
/*str转char*类型,str toLatin1()*/
tcp_socket->write(str.toLatin1());

}

void Widget::on_pushButton_clicked()
{
/登录按钮/
/发送数据/
QString str = ‘L’ + ui->lineEdit_2->text() + ‘#’ + ui->lineEdit->text();
/str转char类型,str toLatin1()*/
tcp_socket->write(str.toLatin1());
}

main.cpp

#include “widget.h”
#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();

return a.exec();

}

UI设计界面在这里插入图片描述

服务器使用uboot编写

代码块

#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <dirent.h>
#include <sqlite3.h>
int tcp_init(const char *ip,int port) //tcp服务器初始化
{
int sockfd;
int ret;
sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建套接字(TCP)

/* 创建一张空卡addr */
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port   = htons(port);
addr.sin_addr.s_addr = inet_addr(ip); //填写自己的ip

ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); //绑定地址信息
if(ret==-1){
    perror("bind");
    return -1;
}

listen(sockfd,50);                               //设置监听队列 队列长度32

return sockfd;

}
int do_client(int connfd) //处理客户请求
{
char buf[512];
char data[512];
int ret;
while(1){

    memset(buf,0,sizeof(buf));
    ret = recv(connfd,buf,sizeof(buf),0);   
    if(ret<=0){
        printf("客户端退出\n");
        close(connfd);
        exit(0);  //结束进程
    }
    printf("recv:%dbytes,buf:%s\n",ret,buf);
    //解析客户端的请求 根据请求给响应数据
    
    if(*buf=='R'){
        printf("注册请求:%s\n",buf+1);
        
        char name[32];
        char paswd[32];
/*分离账号密码*/
        char *ptr = strstr(buf+1,"#");
        strcpy(paswd,ptr+1);
        *ptr = 0;
        strcpy(name,buf+1);

        printf("name:%s\n",name);
        printf("paswd:%s\n",paswd);

        sqlite3 *db;
        int ret = sqlite3_open("my.db",&db);  //打开数据库
        if(ret!=SQLITE_OK){
            printf("sqlite3_open failed\n");
            exit(-1);
        }



        //插入数据库(插入用户信息)
         
        char sql[256];
        snprintf(sql,sizeof(sql),"insert into user values('%s','%s')",name,paswd);
        printf("sql:%s\n",sql);

        char *errmsg;
        ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
        if(ret!=SQLITE_OK){
            write(connfd,"sign up failed",14);
            printf("sqlite3_exec :%s\n",errmsg);
            //exit(-1);
        }
        else
        {
            write(connfd,"sign up succeed",15);
        }

        sqlite3_close(db);                   //关闭数据库

    }
    else if(*buf=='L'){
        printf("登录请求:%s\n",buf+1);


        char name[32];
        char paswd[32];

        char *ptr = strstr(buf+1,"#");
        strcpy(paswd,ptr+1);
        *ptr = 0;
        strcpy(name,buf+1);

        printf("name:%s\n",name);
        printf("paswd:%s\n",paswd);

        sqlite3 *db;
        int ret = sqlite3_open("my.db",&db);  //打开数据库
        if(ret!=SQLITE_OK){
            printf("sqlite3_open failed\n");
            exit(-1);
        }



        //查询数据库(匹配用户信息)
         
        char sql[256];
        snprintf(sql,sizeof(sql),"select * from user where name='%s' and passwd='%s' ",name,paswd);
        printf("sql:%s\n",sql);

        char **resultp;
        int nrow;
        int ncolumn;
        char *errmsg;
        ret =sqlite3_get_table(db,sql,&resultp,&nrow, &ncolumn, &errmsg);
        if(ret!=SQLITE_OK){
            write(connfd,"sign in failed",14);
            printf("sqlite3_get_table:%s\n",errmsg);
            //exit(-1);
        }
        else
        {
            /*nrow是判断之后查询到的记录数目
            * 未查询到不会报错,而是nrow = 0*/
            if(nrow == 1){
                write(connfd,"sign in succeed",15);
            }
            else{
                write(connfd,"sign in failed",14);
            }
        }
        printf("nrow:%d\n",nrow);



        sqlite3_close(db);                   //关闭数据库
    }
}

}
void signal_handler(int sig)
{
//waitpid(-1,NULL,WNOHANG);
while(waitpid(-1,NULL,WNOHANG)>0);
}
int main(void)
{
signal(SIGCHLD,signal_handler); //僵尸处理
int sockfd,connfd;
int ret;
sockfd = tcp_init(“192.168.21.103”,8888);
if(sockfd==-1){
exit(-1);
}

while(1){
    printf("wait for connect...\n");
    connfd = accept(sockfd, NULL,NULL);          //建立连接 阻塞
    if(connfd==-1){                              
        if(errno == EINTR){
            continue;                            //避免被信号打扰
        }
        else{
            perror("accept");
            exit(-1);
        }
    }
    printf("connected %d\n",connfd);

    pid_t pid = fork();
    if(pid == 0 ){
        close(sockfd);
        do_client(connfd);                       //子进程负责处理 客户请求(connfd)
    }
    else{
        close(connfd);
        continue;                                //父进程负责处理 连接请求(sockfd)   
    }

}

close(sockfd);

return 0;

}

可以直接复制粘贴使用,ip和端口采用默认,可以自行修改。本博客仅用于参考学习!

使用PyQt5创建一个简易计算器,可以分为以下几个步骤: 1. **导入所需库**: 首先需要导入PyQt5的一些核心模块,如`QtWidgets`用于界面设计,`uic`用于读取并解析UI文件。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout ``` 2. **设计UI**: 使用`.ui`文件或者直接在代码中编写窗口布局。这里我们可以创建两个输入框、一个显示区域以及四个基本运算按钮。 ```python class Calculator(QWidget): def __init__(self): super().__init__() self.ui = uic.loadUi('calculator.ui', self) ``` 3. **设置事件处理函数**: 对于每个运算按钮,你需要绑定点击事件,获取输入框的数据,执行相应的计算,并更新显示结果。 ```python def button_click(numbers, operator): # 这里假设有一个全局变量result用于存储当前计算结果 global result result += str(numbers) + operator self.display.setText(result) # 模拟加法按钮点击事件 def add(): button_click(10, '+') # ...其他操作符的处理类似 ``` 4. **布局和显示窗口**: 创建窗口布局并将各个元素添加到窗口中,最后显示窗口。 ```python layout = QVBoxLayout() operator_buttons = ['+', '-', '*', '/'] for op in operator_buttons: btn = QPushButton(op) btn.clicked.connect(lambda _, op=op: button_click(None, op)) layout.addWidget(btn) # 输入框和结果显示区域 input_field = QLineEdit() display = QLabel("0") layout.addWidget(input_field) layout.addWidget(display) self.setLayout(layout) self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Calculator() sys.exit(app.exec_()) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值