玉兔远程控制 0.1.0-bate6
载入中...
搜索中...
未找到
FrmActive.cpp
1#include <QVBoxLayout>
2#include <QLoggingCategory>
3#include <QHeaderView>
4#include <QLabel>
5#include <QMenu>
6#include "FrmActive.h"
7
8static Q_LOGGING_CATEGORY(log, "App.FrmActive")
9
10CFrmActive::CFrmActive(QSet<COperate *> &operates,
11 CParameterApp &parameterApp,
12 QMenu* pOperate,
13 QAction* pStop,
14 RabbitCommon::CRecentMenu *pRecentMenu,
15 QWidget *parent)
16 : QWidget(parent)
17 , m_pDockTitleBar(nullptr)
18 , m_pOperate(pOperate)
19 , m_pStop(pStop)
20 , m_pRecentMenu(pRecentMenu)
21 , m_Operates(operates)
22 , m_pAddToFavorite(nullptr)
23 , m_ParameterApp(parameterApp)
24 , m_pTableView(nullptr)
25 , m_pModel(nullptr)
26 , m_pMenu(nullptr)
27 , m_pToolBar(nullptr)
28 , m_nId(3)
29{
30 bool check = false;
31 //setFocusPolicy(Qt::NoFocus);
32 //setAttribute(Qt::WA_DeleteOnClose);
33 setWindowTitle(tr("Activity list"));
34
35 QVBoxLayout* pLayout = new QVBoxLayout(this);
36 if(!pLayout) {
37 qCritical(log) << "new QVBoxLayout(this) fail";
38 return;
39 }
40 setLayout(pLayout);
41
42 m_pToolBar = new QToolBar(this);
43 m_pToolBar->setVisible(m_ParameterApp.GetDockListActiveShowToolBar());
44 // Create recent menu
45 auto ptbRecent = new QToolButton(m_pToolBar);
46 ptbRecent->setFocusPolicy(Qt::NoFocus);
47 ptbRecent->setPopupMode(QToolButton::InstantPopup);
48 //ptbRecent->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
49 ptbRecent->setMenu(m_pRecentMenu);
50 ptbRecent->setIcon(m_pRecentMenu->icon());
51 ptbRecent->setText(m_pRecentMenu->title());
52 ptbRecent->setToolTip(m_pRecentMenu->title());
53 ptbRecent->setStatusTip(m_pRecentMenu->title());
54 m_pToolBar->addWidget(ptbRecent);
55 // Create start menu
56 auto ptbStart = new QToolButton(m_pToolBar);
57 ptbStart->setFocusPolicy(Qt::NoFocus);
58 ptbStart->setPopupMode(QToolButton::InstantPopup);
59 //ptbStart->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
60 ptbStart->setMenu(m_pOperate);
61 ptbStart->setIcon(m_pOperate->icon());
62 ptbStart->setText(m_pOperate->title());
63 ptbStart->setToolTip(tr("Start"));
64 ptbStart->setStatusTip(tr("Start"));
65 m_pToolBar->addWidget(ptbStart);
66
67 m_pToolBar->addAction(m_pStop);
68 m_pToolBar->addSeparator();
69 m_pAddToFavorite = m_pToolBar->addAction(QIcon::fromTheme("emblem-favorite"), tr("Add to favorite"),
70 this, SLOT(slotAddToFavorite()));
71 m_pAddToFavorite->setStatusTip(m_pAddToFavorite->text());
72 m_pAddToFavorite->setToolTip(m_pAddToFavorite->text());
73 m_pAddToFavorite->setEnabled(false);
74 layout()->addWidget(m_pToolBar);
75
76 m_pDockTitleBar = new RabbitCommon::CTitleBar(parent);
77 // Create tools pushbutton in title bar
78 m_pMenu = new QMenu(tr("Tools"), m_pDockTitleBar);
79 m_pMenu->addMenu(m_pRecentMenu);
80 m_pMenu->addMenu(m_pOperate);
81 m_pMenu->addAction(m_pStop);
82 m_pMenu->addAction(m_pAddToFavorite);
83
84 QPushButton* pTools = m_pDockTitleBar->CreateSmallPushButton(
85 QIcon::fromTheme("tools"), m_pDockTitleBar);
86 pTools->setToolTip(tr("Tools"));
87 pTools->setMenu(m_pMenu);
88 m_pMenu->addSeparator();
89 auto pShowToolBar = m_pMenu->addAction(tr("Show tool bar"), this, [&](){
90 QAction* a = (QAction*)sender();
91 if(a) {
92 m_pToolBar->setVisible(a->isChecked());
93 m_ParameterApp.SetDockListActiveShowToolBar(a->isChecked());
94 m_ParameterApp.Save();
95 }
96 });
97 pShowToolBar->setCheckable(true);
98 pShowToolBar->setChecked(m_ParameterApp.GetDockListActiveShowToolBar());
99
100 QList<QWidget*> lstWidget;
101 lstWidget << pTools;
102 m_pDockTitleBar->AddWidgets(lstWidget);
103
104 m_pTableView = new QTableView(this);
105 if(!m_pTableView) {
106 qCritical(log) << "new QTableView fail";
107 return;
108 }
109 layout()->addWidget(m_pTableView);
110 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
111 check = connect(m_pTableView,
112 SIGNAL(customContextMenuRequested(const QPoint &)),
113 this, SLOT(slotCustomContextMenu(const QPoint &)));
114 Q_ASSERT(check);
115 check = connect(m_pTableView, SIGNAL(clicked(const QModelIndex &)),
116 this, SLOT(slotClicked(const QModelIndex&)));
117 Q_ASSERT(check);
118
119 m_pModel = new QStandardItemModel(m_pTableView);
120 m_pTableView->setModel(m_pModel);
121 m_pTableView->verticalHeader()->hide();
122 m_pTableView->setSelectionMode(QAbstractItemView::SingleSelection);
123 m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
124 m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
125 m_pModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name")));
126 m_pModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Protocol")));
127 m_pModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Type")));
128 m_pModel->setHorizontalHeaderItem(m_nId, new QStandardItem(tr("ID")));
129
130 slotLoad();
131
132 //必须在 setModel 后,才能应用
133 /*第二个参数可以为:
134 QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
135 QHeaderView::Fixed :2 用户不可更改列宽
136 QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
137 QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
138 */
139 m_pTableView->horizontalHeader()->setSectionResizeMode(
140#if defined(DEBUG) && !defined(Q_OS_ANDROID)
141 0,
142#endif
143 QHeaderView::Interactive);
144 //以下设置列宽函数必须要数据加载完成后使用,才能应用
145 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
146 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
147 //m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
148 //m_pTableView->resizeColumnToContents(1); //设置第0列宽度自适应内容
149 //m_pTableView->resizeColumnToContents(2); //设置第0列宽度自适应内容
150 //m_pTableView->resizeColumnToContents(m_nId); //设置第1列宽度自适应内容
151
152 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
153 QModelIndexList lstIndex;
154 if(pSelect)
155 lstIndex = pSelect->selectedRows();
156 if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
157 {
158 m_pTableView->selectRow(0);
159 }
160}
161
162CFrmActive::~CFrmActive()
163{}
164
165void CFrmActive::slotCustomContextMenu(const QPoint &pos)
166{
167 QMenu menu;
168 QModelIndex index = m_pTableView->currentIndex();
169 int r = index.row();
170 if(-1 < r && r < m_Operates.size())
171 {
172 QVariant v = m_pModel->item(index.row(), m_nId)->data();
173 COperate* c = v.value<COperate*>();
174 if(c) {
175 auto m = c->GetMenu();
176 //menu.addMenu(m);
177 if(m)
178 menu.addActions(m->actions());
179 }
180 }
181 if(!menu.isEmpty())
182 menu.addSeparator();
183 menu.addMenu(m_pRecentMenu);
184 menu.addMenu(m_pOperate);
185 menu.addAction(m_pStop);
186 menu.addSeparator();
187 menu.addAction(m_pAddToFavorite);
188 menu.exec(mapToGlobal(pos));
189}
190
191void CFrmActive::slotClicked(const QModelIndex &index)
192{
193 QVariant v = m_pModel->item(index.row(), m_nId)->data();
194 COperate* c = v.value<COperate*>();
195 emit sigChanged(c);
196}
197
198void CFrmActive::slotLoad()
199{
200 if(!m_pModel)
201 return;
202 m_pModel->removeRows(0, m_pModel->rowCount());
203 m_pAddToFavorite->setEnabled(m_Operates.size() > 0);
204 foreach(auto c, m_Operates) {
205 QList<QStandardItem*> lstItem;
206 QStandardItem* pName = new QStandardItem(c->Icon(), c->Name());
207 pName->setToolTip(c->Description());
208 lstItem << pName;
209 QStandardItem* pProtocol = new QStandardItem(c->Protocol());
210 lstItem << pProtocol;
211 QStandardItem* pType = new QStandardItem(c->GetTypeName());
212 lstItem << pType;
213 QStandardItem* pId = new QStandardItem(c->Id());
214 QVariant v;
215 v.setValue(c);
216 pId->setData(v);
217 lstItem << pId;
218 m_pModel->appendRow(lstItem);
219 }
220
221 //以下设置列宽函数必须要数据加载完成后使用,才能应用
222 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
223 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
224 m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
225 //m_pTableView->resizeColumnToContents(m_nId); //设置第1列宽度自适应内容
226}
227
228void CFrmActive::slotViewChanged(const QWidget *pView)
229{
230 int nIndex = -1;
231 if(m_Operates.size() != m_pModel->rowCount())
232 slotLoad();
233 foreach (auto c, m_Operates) {
234 nIndex++;
235 if(c->GetViewer() == pView)
236 break;
237 }
238 if(-1 >= nIndex)
239 return;
240 m_pTableView->selectRow(nIndex);
241}
242
243void CFrmActive::slotAddToFavorite()
244{
245 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
246 QModelIndexList lstIndex = pSelect->selectedRows();
247 foreach(auto index, lstIndex)
248 {
249 if(!index.isValid()) continue;
250 QVariant v = m_pModel->item(index.row(), m_nId)->data();
251 COperate* c = v.value<COperate*>();
252 if(!c) continue;
253 QString szName = c->Name();
254 QIcon icon = c->Icon();
255 QString szDescription = c->Description();
256 QString szFile = c->GetSettingsFile();
257 emit sigAddToFavorite(szFile, szName, szDescription, icon);
258 }
259}
操作接口。
Definition Operate.h:51
virtual const QIcon Icon() const
Icon
Definition Operate.cpp:85
virtual QWidget * GetViewer()=0
得到显示视图
virtual const QString Protocol() const
Protocol
Definition Operate.cpp:74
virtual const QString Name()
Name
Definition Operate.cpp:44
virtual const QString Description()
Description
Definition Operate.cpp:49
virtual const QString Id()
Identity
Definition Operate.cpp:34
virtual const QString GetTypeName() const
Get type name
Definition Operate.cpp:79
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu
Definition Operate.cpp:110