从零开始做远控 第一篇

如果你从没看过这系列教程请点击:从零开始做远控 简介篇

搭建Zero服务端的界面


新建个ZeroServer项目,打开Qt

新建项目 -> 选择Qt Widgets Application然后按下一步 -> 选择基类为QWidget
新建文件 -> 选择Qt -> Qt Resource File -> 把资源文件resources文件夹添加进来: 资源文件下载地址


开始写代码,这部分代码主要是些控件,每一节完成后我都会把完整的项目给大家下载,大家不懂的话可以照着做。

这代码都打好注释了,从构造函数开始看起就OK。

这一节都比较简单,只是创建一些控件和事件处理。


widget.h

/*
 *  Author: sumkee911@gmail.com
 *  Date: 2016-12-18
 *  Brief: Zero远控服务端操作界面
 *
 */

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDesktopWidget>
#include <QPushButton>
#include <QTableWidget>
#include <QMenu>
#include <QMouseEvent>
#include <QDebug>
#include <QCursor>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    QTableWidget *mClientTable; // 客户列表
    QMenu *mPopupMenu;          // 弹出菜单

public slots:
    void screenSpyClicked();
    void keyboardClicked();
    void fileSpyClicked();
    void cmdSpyClicked();
    void sendMessageClicked();
    void rebootClicked();
    void quitClicked();

    // 添加客户到列表
    void addClientToTable(int id, QString name, QString ip, int port, QString systemInfo);

    // 从列表中删除客户
    void removeClientFromTable(int id);

    // 当前选中的客户ID
    int currentClientIdFromTable();

protected:
    // 事件过滤
    bool eventFilter(QObject *watched, QEvent *event);
};

#endif // WIDGET_H


widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 先设置窗口的头相,资源图片在上面下载
    this->setWindowIcon(QIcon(":/resources/zero.ico"));
    this->setWindowTitle("ZeroServer");

    // 设置窗口大小
    const int w = 600, h = 500;
    // 将窗口至中,你必须在widget.h里#include <QDesktopWidget>
    // 以后我就不再多说了,没有include的类就自己在.h文件里include
    const int x = (QApplication::desktop()->width() - w) / 2;
    const int y = (QApplication::desktop()->height() - h) / 2;
    this->setGeometry(x, y, w, h);
    this->setMaximumSize(QSize(w, h));
    this->setMinimumSize(QSize(w, h));

    // 设置按钮,暂定四个主要功能(屏幕监控,键盘监控,文件盗取,命令行控制)
    // 其他功能以后有需要再加
    QPushButton *btScreenSpy = new QPushButton(QIcon(":/resources/screenspy.png"),"屏幕监控", this);
    btScreenSpy->setIconSize(QSize(60,60));
    // 建立响应点击信息,槽函数你需要在widget.h里增加
    connect(btScreenSpy, SIGNAL(clicked(bool)), this, SLOT(screenSpyClicked()));
    btScreenSpy->setGeometry(0,0,150, 100);

    QPushButton *btKeyboardSpy = new QPushButton(QIcon(":/resources/keyboardspy.png"),"键盘监控", this);
    btKeyboardSpy->setIconSize(QSize(60,60));
    connect(btKeyboardSpy, SIGNAL(clicked(bool)), this, SLOT(keyboardClicked()));
    btKeyboardSpy->setGeometry(150,0,150,100);

    QPushButton *btFileSpy = new QPushButton(QIcon(":/resources/filespy.png"),"文件监控", this);
    btFileSpy->setIconSize(QSize(60,60));
    connect(btFileSpy, SIGNAL(clicked(bool)), this, SLOT(fileSpyClicked()));
    btFileSpy->setGeometry(2*150,0,150,100);

    QPushButton *btCmdSpy = new QPushButton(QIcon(":/resources/cmdspy.png"),"命令行控制", this);
    btCmdSpy->setIconSize(QSize(60,60));
    connect(btCmdSpy, SIGNAL(clicked(bool)), this, SLOT(cmdSpyClicked()));
    btCmdSpy->setGeometry(3*150,0,150, 100);

    // 设置QTableWiget来存放上线客户的信息
    mClientTable = new QTableWidget(this);
    mClientTable->setGeometry(0,100,600,400);
    mClientTable->setColumnCount(5);
    mClientTable->setHorizontalHeaderItem(0, new QTableWidgetItem("id"));
    mClientTable->setColumnWidth(0, 80);
    mClientTable->setHorizontalHeaderItem(1, new QTableWidgetItem("用户名"));
    mClientTable->setColumnWidth(1, 160);
    mClientTable->setHorizontalHeaderItem(2, new QTableWidgetItem("ip"));
    mClientTable->setColumnWidth(2, 160);
    mClientTable->setHorizontalHeaderItem(3, new QTableWidgetItem("端口"));
    mClientTable->setColumnWidth(3, 80);
    mClientTable->setHorizontalHeaderItem(4, new QTableWidgetItem("系统"));
    mClientTable->setColumnWidth(4, 120);
    // 设置选中一整行
    mClientTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    // 设置一次最多能选中一样
    mClientTable->setSelectionMode(QAbstractItemView::SingleSelection);
    // 设置不能修改
    mClientTable->setEditTriggers(QAbstractItemView::NoEditTriggers);

    // 增加三个槽函数在这个类
    // 增加客户到列表函数:addClientToTable(id, 电脑名, ip, 端口, 系统型号);
    // 从列表中删除客户:removeClientFromTable(id);
    // 获取当前客户ID: currentClientIdFromTable();

    // 当右击客户列表时弹出的操作菜单,比如重启客户的电脑
    mPopupMenu = new QMenu(this);
    QAction *actSendMessage = mPopupMenu->addAction("发送弹窗消息");
    connect(actSendMessage,SIGNAL(triggered(bool)), this, SLOT(sendMessageClicked()));
    QAction *actReboot = mPopupMenu->addAction("重新开机");
    connect(actReboot,SIGNAL(triggered(bool)), this,SLOT(rebootClicked()));
    QAction *actQuit = mPopupMenu->addAction("强制下线");
    connect(actQuit, SIGNAL(triggered(bool)), this, SLOT(quitClicked()));

    // 在列表中增加鼠标事件监控,当右击点下时就能弹出菜单
    mClientTable->installEventFilter(this);

    addClientToTable(1, "sumkee911", "127.0.0.1", 8888, "Windows 7");
}

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

void Widget::screenSpyClicked()
{

}

void Widget::keyboardClicked()
{

}

void Widget::fileSpyClicked()
{

}

void Widget::cmdSpyClicked()
{

}

void Widget::sendMessageClicked()
{

}

void Widget::rebootClicked()
{

}

void Widget::quitClicked()
{

}

void Widget::addClientToTable(int id, QString name, QString ip, int port, QString systemInfo)
{
    int count = mClientTable->rowCount();
    mClientTable->setRowCount(count+1);

    QTableWidgetItem *itemId = new QTableWidgetItem(QString::number(id));
    mClientTable->setItem(count, 0 , itemId);

    QTableWidgetItem *itemName = new QTableWidgetItem(name);
    mClientTable->setItem(count, 1 , itemName );

    QTableWidgetItem *itemIp = new QTableWidgetItem(ip);
    mClientTable->setItem(count, 2 , itemIp);

    QTableWidgetItem *itemPort = new QTableWidgetItem(QString::number(port));
    mClientTable->setItem(count, 3 , itemPort);

    QTableWidgetItem *itemSystemInfo = new QTableWidgetItem(systemInfo);
    mClientTable->setItem(count, 4 , itemSystemInfo);
}

void Widget::removeClientFromTable(int id)
{
    // 用ID判断该删除的行索引
    int count = mClientTable->rowCount();
    for (int i =0; i< count; ++i) {
        if (mClientTable->item(i, 0)->text().toInt() == id) {
            // 删除
            mClientTable->removeRow(i);
            break;
        }
    }
}

int Widget::currentClientIdFromTable()
{
    int index = mClientTable->currentRow();
    if (index == -1) {
        return -1;
    }
    return mClientTable->itemAt(index, 0)->text().toInt();
}

bool Widget::eventFilter(QObject *watched, QEvent *event)
{

    // 右键弹出菜单
    if (watched==(QObject*)mClientTable) {
        if (event->type() == QEvent::ContextMenu) {
            mPopupMenu->exec(QCursor::pos());
        }
    }

    return QObject::eventFilter(watched, event);
}


效果图:





完整项目:

下载本节完整项目


  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值