Rabbit Remote Control 0.1.0-bate10
Loading...
Searching...
No Matches
FrmViewServer.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QMenu>
4#include <QHeaderView>
5#include <QDateTime>
6#include <QVBoxLayout>
7#include <QLoggingCategory>
8#include "FrmViewServer.h"
9
10static Q_LOGGING_CATEGORY(log, "ViewServer")
11CFrmViewServer::CFrmViewServer(QWidget *parent)
12 : QWidget{parent}
13 , m_pToolBar(nullptr)
14 , m_ptvClients(nullptr)
15 , m_plbConnectCount(nullptr)
16{
17 bool check = false;
18 qDebug(log) << Q_FUNC_INFO;
19 QVBoxLayout* pLayout = new QVBoxLayout(this);
20 setLayout(pLayout);
21 m_pToolBar = new QToolBar(this);
22 if(pLayout && m_pToolBar)
23 pLayout->addWidget(m_pToolBar);
24 m_ptvClients = new QTableView(this);
25 if(pLayout && m_ptvClients) {
26 pLayout->addWidget(m_ptvClients);
27
28 m_ptvClients->installEventFilter(this);
29 m_ptvClients->setModel(&m_ModelConnect);
30 //m_ptvClients->verticalHeader()->hide();
31 m_ptvClients->setSelectionMode(QAbstractItemView::SingleSelection);
32 m_ptvClients->setSelectionBehavior(QAbstractItemView::SelectRows);
33 m_ptvClients->setEditTriggers(QAbstractItemView::NoEditTriggers);
34 m_ModelConnect.setHorizontalHeaderItem(0, new QStandardItem(tr("IP")));
35 m_ModelConnect.setHorizontalHeaderItem(1, new QStandardItem(tr("Port")));
36 m_ModelConnect.setHorizontalHeaderItem(2, new QStandardItem(tr("Time")));
37 //必须在 setModel 后,才能应用
38 /*第二个参数可以为:
39 QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
40 QHeaderView::Fixed :2 用户不可更改列宽
41 QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
42 QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
43 */
44 m_ptvClients->horizontalHeader()->setSectionResizeMode(
45#if defined(DEBUG) && !defined(Q_OS_ANDROID)
46 0,
47#endif
48 QHeaderView::Interactive);
49
50 m_ptvClients->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
51 check = connect(m_ptvClients, SIGNAL(customContextMenuRequested(const QPoint &)),
52 this, SLOT(slotContextMenuRequested(const QPoint&)));
53 Q_ASSERT(check);
54 }
55
56 m_plbConnectCount = new QLabel(this);
57 if(pLayout && m_plbConnectCount)
58 pLayout->addWidget(m_plbConnectCount);
59}
60
61CFrmViewServer::~CFrmViewServer()
62{
63 qDebug(log) << Q_FUNC_INFO;
64}
65
66void CFrmViewServer::AddActionInToolBar(QAction *pAction)
67{
68 if(m_pToolBar)
69 m_pToolBar->addAction(pAction);
70}
71
72void CFrmViewServer::slotConnected(const QString& szIp, const quint16 port)
73{
74 QList<QStandardItem*> lstItem;
75 QStandardItem* pIP = new QStandardItem(szIp);
76 lstItem << pIP;
77 QStandardItem* pPort = new QStandardItem(QString::number(port));
78 lstItem << pPort;
79 QStandardItem* pTime = new QStandardItem(QDateTime::currentDateTime().toString(
80 QLocale::system().dateTimeFormat()));
81 lstItem << pTime;
82 m_ModelConnect.appendRow(lstItem);
83 m_ptvClients->resizeColumnToContents(0);
84 m_ptvClients->resizeColumnToContents(1);
85 m_ptvClients->resizeColumnToContents(2);
86
87 m_Stats.AddConnects();
88 m_plbConnectCount->setText(m_Stats.ToString());
89}
90
91void CFrmViewServer::slotDisconnected(const QString& szIp, const quint16 port)
92{
93 for (int row = 0; row < m_ModelConnect.rowCount(); row++) {
94 QModelIndex index = m_ModelConnect.index(row, 0);
95 QString ip = m_ModelConnect.data(index).toString();
96 QModelIndex indexPort = m_ModelConnect.index(row, 1);
97 QString szPort = m_ModelConnect.data(indexPort).toString();
98 if (szIp == ip && szPort == QString::number(port)) {
99 m_ModelConnect.removeRows(row, 1);
100 m_Stats.Disconnects();
101 m_plbConnectCount->setText(m_Stats.ToString());
102 break;
103 }
104 }
105}
106
107void CFrmViewServer::slotContextMenuRequested(const QPoint& pos)
108{
109 if(m_ModelConnect.rowCount() == 0)
110 return;
111 QMenu m;
112 m.addAction(tr("Disconnect"), this, [this](){
113 QItemSelectionModel* pSelect = m_ptvClients->selectionModel();
114 QModelIndexList lstIndex = pSelect->selectedRows();
115 foreach(auto index, lstIndex) {
116 QString szIp = m_ModelConnect.item(index.row(), 0)->text();
117 quint16 port = m_ModelConnect.item(index.row(), 1)->text().toUInt();
118 emit sigDisconnect(szIp, port);
119 }
120 });
121 QPoint p = m_ptvClients->mapToGlobal(pos);
122 m.exec(p);
123}
The CFrmViewServer class.