Russian Qt Forum
Октябрь 02, 2024, 17:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удалённое управление компьютером  (Прочитано 2344 раз)
yuran
Гость
« : Декабрь 23, 2014, 23:44 »

Я навичок в QT, помогите разобраться, нашёл проект, вот  его код и описание
Код:
 Реализация функциональной части
Сервер.
Сервер содержит следующие методы и слоты:
slotNewConnection – вызывается каждый раз при соединении с новым клиентом. Подтверждает соединение, отвечает за старт таймера и потока и ожидает получения команд от клиента. В листинге 1 приведён исходный код данного метода.
Листинг 1 – исходный код слота slotNewConnection
void MyServer::slotNewConnection()
{
pClientSocket = m_ptcpServer->nextPendingConnection();
connect(pClientSocket, SIGNAL(readyRead()), this, SLOT(slotReadClient()));
startTimer(3000);
_thread.start();
 QMessageBox::information(0,"Connection","Connected to Client!!!");
}

не могу понять какого типа переменная _thread?Непонимающий??

slotReadClient – данный слот срабатывает при поступлении запросов от клиента и высылке сигнала readyToRead. Данные добавляются в очередь методом enqueue, которая в свою очередь обрабатывается в отдельном потоке.
Код:
void MyServer::slotReadClient()
{
count++;
pClientSocket = (QTcpSocket*)sender();
QDataStream in(pClientSocket);
in.setVersion(QDataStream::Qt_4_5);
if (_block == 0)
{
if (pClientSocket->bytesAvailable() < (int)sizeof(quint16))
{
return;
}
in >> _block;
}
if (pClientSocket->bytesAvailable() < _block)
{
return;
}
else
{
_block = 0;
QString command = "";
in >> command;
_thread._queue.enqueue(command);
}
}


timerEvent – метод, который вызывается при генерации события таймера QTimerEvent, который в свою очередь генерируется по истечении установленного интервала запуска таймера. Данный метод реализовывает создание скриншота рабочей области, а также передача его клиенту.
 исходный код метода timerEvent
Код:
void MyServer::timerEvent(QTimerEvent *qe)
{
qDebug()<<"it's working";
QDesktopWidget* gt = QApplication::desktop();
QPixmap pix = QPixmap::grabWindow(gt->screen()->winId());
QImage img(pix.toImage());
QString st = "./2.jpg";
img.save(st,"JPEG");
if(img.isNull())
{
qDebug() << "NULL";
}
QBuffer buf;
QImageWriter writer(&buf,"jpg");
writer.write(img);
QByteArray byte;
QDataStream out(&byte,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_8);
out << (quint32)buf.size();
byte.append(buf.data());1
pClientSocket->write(byte);
}

тут собственно клиент
Код:
void MainWindow::dialog_call()
{
QRegExp reg("\\b(([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\b");
str = "localhost";

bool bOk;

while(1)
{
str = QInputDialog::getText(0,"IP-Address","Enter IP(cancel - localhost): ",QLineEdit::Normal,"localhost",&bOk);
if(!bOk)
{
str = "localhost";
}
if((str.contains(reg)>0) || (str == "localhost"))
{
client = new MyClient(str,2323);
flag = true;
break;
}
}
}

Код:
void MyClient::slotReadyRead()
{
if(m_size_bytes == 0)
{
QDataStream stream(m_pTcpSocket);
if (m_pTcpSocket->bytesAvailable() < sizeof(quint32))
{
return;
}
stream >> m_size_bytes;
}
if (m_size_bytes > m_pTcpSocket->bytesAvailable())
{
return;
}
QByteArray barr = m_pTcpSocket->read(m_size_bytes);
QBuffer buffer(&barr);
buffer.open(QIODevice::ReadOnly);
QImageReader reader(&buffer, "jpg");
QImage image = reader.read();
if (!image.isNull())
{
count = 1;
QPixmap px = QPixmap::fromImage(image);
pixmap = new QPixmap(px);
pixmap->save("./test_1.jpg","jpg");
m_size_bytes = 0;
}

 else
 {
 QPixmap pix("./3.jpg");
 pix.save("./test_1.jpg","jpg");
 }
}

При срабатывании любого события мыши и клавиатуры вызываются соответственные переопределенные методы обработки данных событий, в которых происходит анализ полученной информации о том, например, какая кнопка мыши была нажата либо какая кнопка клавиатуры была нажата или отпущена. Кроме анализа полученных данных, происходит запись данной информации перечисления, а также вызов метода sendToServer, в котором происходит преобразование полученный данных в строку, далее в массив байт и передача серверу обработанных данных.
один из переопределенных методов mousePressEvent
Код:
void MainWindow::mousePressEvent(QMouseEvent *pe)
{
wh = fal;
x_pos = pe->x();
y_pos = pe->y();
state = Press;
device = Mouse;
if(pe->buttons() & Qt::LeftButton)
{
button = Left;
}
if(pe->buttons() & Qt::RightButton)
{
button = Right;
}
if(pe->buttons() & Qt::MidButton)
{
button = Middle;
 }
 mov = unmoving;
display();
}
Листинг 7 - метод display
void MainWindow::display()
{
if(flag)
{
st = "Connected...";
lbl->setText(st);
client->slotSendToServer(device, x_pos, y_pos, button, state, wh, mov,keyboard,code,s);
if(client->count == 1)
 {
p.load("./test_1.jpg");
 i = p.width();
 y = p.height();
 this->resize(i,y);
 label->setPixmap(p);
 }
}
}

Меня больше интересует следующее т.к. данных классов в описании нет, я не понимаю как его реализовать.
Thread – класс, отвечающий за выполнение событий в системе на основании полученных данных от клиента. События будут выполняться в отдельном потоке. Класс унаследован от класса QThread, который предоставляет реализацию потоков.
MyServer – класс, отвечающий за TCP-соединение и создание скриншотов, наследник QObject, имеет собственные слоты.
MainWindow – класс, отвечающий за визуализацию самого приложения. Наследует класс QMainWindow, которое реализует главное окно, содержащее в себе типовые виджеты. в данном классы использованы такие типовые виджеты, как меню и поле текстового ввода.

в файле настроек подключил "network"

кто- нибудь помогите его собрать, пожалуйста
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Декабрь 24, 2014, 01:15 »

есть такое чувство, что _thread имеет тип QThread. дальше не читал.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.