transmitterswitch.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. #include "transmitterswitch.h"
  2. #include "importtemplate.h"
  3. #include "ui_transmitterswitch.h"
  4. #include <QFile>
  5. #include <QList>
  6. #include <memory>
  7. #include <QLayout>
  8. #include "LHQLogAPI.h"
  9. #include "widgetitems.h"
  10. #include "pBtnUserData2.h"
  11. #include "WebAPI/FromWebAPI.h"
  12. #include "TransmitterSwitchInfo.h"
  13. #include "timewidget.h"
  14. #include "cdate.h"
  15. #include "savetotemplate.h"
  16. #include "importtemplate.h"
  17. #include "warning.h"
  18. #include "tipwidget.h"
  19. #include "UIStyleManager.h"
  20. #include "PlanData.h"
  21. #include "PlanCard.h"
  22. #include "flowlayout.h"
  23. TransmitterSwitch::TransmitterSwitch(QWidget *parent) :
  24. QWidget(parent),
  25. ui(new Ui::TransmitterSwitch)
  26. {
  27. ui->setupUi(this);
  28. /* 创建一个布局 */
  29. QVBoxLayout* layout = new QVBoxLayout(parent);
  30. layout->setMargin(0);
  31. layout->setSpacing(0);
  32. parent->setLayout(layout);
  33. layout->addWidget(this);
  34. /* 创建一个流式布局,存放卡片 */
  35. m_flowlayout = new FlowLayout(ui->scrollAreaContents_Card, 0, m_cardHorSpacing, 12);
  36. // m_flowlayout->setContentsMargins(0, 0, 0, 0);
  37. // m_flowlayout->setSpacing(200);
  38. ui->scrollAreaContents_Card->setLayout(m_flowlayout);
  39. /* 创建WebAPI实例 */
  40. m_fromWebAPI = new FromWebAPI;
  41. /* 设置“默认计划”按钮可点击 */
  42. ui->pBtn_defaultPlan->setCheckable(true);
  43. ui->pBtn_allFrequency->setCheckable(true);
  44. connect(ui->pBtn_allFrequency, &QPushButton::clicked, this, &TransmitterSwitch::do_selectFrequencyBtn);
  45. /* 设置提示文本 */
  46. m_tipText = new QLabel(this);
  47. m_tipText->resize(936,56);
  48. m_tipText->setObjectName("label_TipText");
  49. m_tipText->setText(R"(按时刻执行模式:即以时刻点为单位进行执行,若某日既为普通日和特殊日,在某一时刻皆有执行动作,将优先执行特殊日在此时刻所计划的动作。
  50. 按天执行模式:即以天为单位进行执行,若某日既为普通日和特殊日,则当日一整天优先执行特殊日所计划的动作,普通日计划当日不再执行。)");
  51. m_tipText->hide();
  52. QPoint pos = ui->label_Tip->mapTo(this, ui->label_Tip->pos());
  53. m_tipText->move(pos.x() + 2, pos.y() + 2 ); /* 去掉阴影的宽度和高度 */
  54. ui->label_Tip->installEventFilter(this);
  55. /* 设置默认值 */
  56. ui->pBtn_defaultPlan->setChecked(true);
  57. ui->rBtn_moment->setChecked(true);
  58. /* 连接信号和槽 */
  59. connect(ui->pBtn_addPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnAddExecPlan);
  60. connect(ui->pBtn_importPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_importData);
  61. connect(ui->pBtn_exportPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_exportData);
  62. connect(ui->pBtn_clearPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_clearCurrentPage);
  63. /* 设置QSS */
  64. connect(&EPUIStyle, &UIStyleManager::signal_qssChanged, this, &TransmitterSwitch::do_setUIStyle);
  65. /* 设置默认的皮肤 */
  66. EPUIStyle.setUIStyle(enum_UIStyle::UI_Dark);
  67. /* 设置默认点击的按钮 */
  68. ui->pBtn_allFrequency->setChecked(true);
  69. }
  70. TransmitterSwitch::~TransmitterSwitch()
  71. {
  72. if(m_tipText != nullptr)
  73. {
  74. delete m_tipText;
  75. m_tipText = nullptr;
  76. }
  77. delete ui;
  78. }
  79. /* 设置样式表路径,给弹窗页面使用,不需要包含最后的white,black */
  80. void TransmitterSwitch::setQSSPath(const QString &qssPath)
  81. {
  82. if(qssPath.isEmpty())
  83. {
  84. return;
  85. }
  86. /* 去掉最后的“/” */
  87. // if(qssPath.endsWith("/"))
  88. // {
  89. // EPUIStyle.setQSSPath(qssPath.left(qssPath.length() - 1));
  90. // } else
  91. // {
  92. // EPUIStyle.setQSSPath(qssPath);
  93. // }
  94. }
  95. /**
  96. * @brief 设置WebAPI信息
  97. *
  98. * @param url WebAPI地址
  99. * @param serID 数据库ID
  100. * @param serKey 限制的关键字
  101. */
  102. void TransmitterSwitch::setWebAPIInfo(const QString &url, const QString &serverID, const QString &serverKey)
  103. {
  104. if(m_fromWebAPI == nullptr)
  105. {
  106. m_fromWebAPI = new FromWebAPI;
  107. }
  108. if(url.isEmpty() || serverID.isEmpty() || serverKey.isEmpty())
  109. {
  110. LH_WRITE_ERROR("WebAPI info is empty");
  111. return;
  112. }
  113. m_fromWebAPI->initWebApi(url, serverID, serverKey);
  114. /* 获取支持的设备 */
  115. m_fromWebAPI->getDeviceInfo(DeviceContainer.getMapDevice());
  116. m_fromWebAPI->getChannelInfo(ChnContainer.getMapChannel());
  117. /* 创建获取到的卡片信息 */
  118. createAllCard();
  119. }
  120. /* 初始化webAPI,重载版 */
  121. void TransmitterSwitch::setWebAPIInfo(const InitData& data)
  122. {
  123. setWebAPIInfo(data.url, data.serverID, data.serverKey);
  124. }
  125. /* 获取EQM数据库计划 */
  126. void TransmitterSwitch::getExecPlanFromEQM()
  127. {
  128. /* 清空本地的计划数据 */
  129. /* 获取页面的配置信息 */
  130. if(m_fromWebAPI->getConfigData(CfgData.getMapConfigData()))
  131. {
  132. // TipWidget::display(TipWidget::OPERATOR_OK, "获取配置成功", this);
  133. }else {
  134. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取配置失败", this);
  135. return;
  136. }
  137. /* 设置计划配置 */
  138. auto& mapConfig = CfgData.getMapConfigData();
  139. for(auto begin = mapConfig.begin(), end = mapConfig.end(); begin != end; begin++)
  140. {
  141. if(begin->key == static_cast<int>(enum_ExecPlanConfig::DefaultPlan))
  142. {
  143. ui->pBtn_defaultPlan->setChecked(begin->value == 1 ? true : false);
  144. }
  145. else if(begin->key == static_cast<int>(enum_ExecPlanConfig::ExecMode))
  146. {
  147. if(begin->value == 0)
  148. {
  149. ui->rBtn_moment->setChecked(true);
  150. }else {
  151. ui->rBtn_day->setChecked(true);
  152. }
  153. }
  154. }
  155. /* 获取计划 */
  156. QList<ExecPlanItemInfo> list;
  157. if(m_fromWebAPI->getExecPlanData(list))
  158. {
  159. TipWidget::display(TipWidget::OPERATOR_OK, "获取计划成功", this);
  160. }else {
  161. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取计划失败", this);
  162. return;
  163. }
  164. /* 添加计划项 */
  165. for(const auto& it : list)
  166. {
  167. }
  168. /* 排序 */
  169. for(int i = 0; i < 8; ++i)
  170. {
  171. }
  172. /* 获取数据插入到全局变量中,会将更新标志位置true,这里需要手动置为false */
  173. /* 调用回调函数 */
  174. if(m_trackCB != nullptr)
  175. {
  176. m_trackCB(2, g_mapTrack.value(2));
  177. }
  178. }
  179. /* 将计划保存到EQM数据库 */
  180. void TransmitterSwitch::saveExecPlanToEQM()
  181. {
  182. QList<ExecPlanItemInfo> list;
  183. /* 获取当前计划的执行模式 */
  184. int execType = 0;
  185. if(ui->rBtn_moment->isChecked())
  186. {
  187. execType = 0;
  188. } else
  189. {
  190. execType = 1;
  191. }
  192. // for(const auto& it : IData.getMapItem())
  193. // {
  194. // for(const auto& it1 : *it)
  195. // {
  196. // ExecPlanItemInfo info;
  197. // info.ExecType = execType;
  198. // info.devName = it1->getDevName();
  199. // info.actionID = it1->getActionNum();
  200. // info.actionName = it1->getActionName();
  201. // info.execTime = it1->getExecTime();
  202. // info.date = it1->getDate();
  203. // info.WeekDay = it1->getWeekDay() + 1;
  204. // list.push_back(info);
  205. // }
  206. // }
  207. /* 写入数据库 */
  208. if(m_fromWebAPI->insertData(list))
  209. {
  210. TipWidget::display(TipWidget::OPERATOR_OK, "保存计划成功", this);
  211. }else {
  212. TipWidget::display(TipWidget::OPERATOR_FAIL, "保存计划失败", this);
  213. }
  214. /* 保存“默认计划”和“执行模式” */
  215. ConfigData config1;
  216. config1.key = static_cast<int>(enum_ExecPlanConfig::DefaultPlan);
  217. config1.value = ui->pBtn_defaultPlan->isChecked() ? 1 : 0;
  218. config1.updateTime = QDateTime::currentDateTime();
  219. CfgData.updateConfigData(config1);
  220. ConfigData config2;
  221. config2.key = static_cast<int>(enum_ExecPlanConfig::ExecMode);
  222. config2.value = ui->rBtn_moment->isChecked() ? 0 : 1;
  223. config2.updateTime = QDateTime::currentDateTime();
  224. CfgData.updateConfigData(config2);
  225. /* 更新“计划是否更新”标志位,在更新前需要先获取数据库的标志位,如果依旧为1,那么本地是否更改都设置为1 */
  226. ConfigData config3;
  227. if(!m_fromWebAPI->getConfigData(static_cast<int>(enum_ExecPlanConfig::IsChanged), config3))
  228. {
  229. config3.key = static_cast<int>(enum_ExecPlanConfig::IsChanged);
  230. }
  231. /* 只要数据库和本地更新标志位有一个为true,说明还未被读走,则设置标志位为true */
  232. // if((config3.value == 1) || IData.isUpdate())
  233. // {
  234. // config3.value = 1;
  235. // }
  236. config3.updateTime = QDateTime::currentDateTime();
  237. CfgData.updateConfigData(config3);
  238. /* 将配置写入数据库 */
  239. m_fromWebAPI->insertConfigData(CfgData.getMapConfigData());
  240. /* 调用回调函数 */
  241. if(m_trackCB != nullptr)
  242. {
  243. m_trackCB(1, g_mapTrack.value(1));
  244. }
  245. }
  246. /* 亮/暗换肤,0是亮色,1是暗色 */
  247. void TransmitterSwitch::setUIStyle(int style)
  248. {
  249. if(style == 0)
  250. {
  251. EPUIStyle.setUIStyle(enum_UIStyle::UI_Light);
  252. }
  253. else if(style == 1)
  254. {
  255. EPUIStyle.setUIStyle(enum_UIStyle::UI_Dark);
  256. }else {
  257. LH_WRITE_ERROR(QString("错误的样式类型: %1").arg(style));
  258. }
  259. }
  260. /* 设置回调函数 */
  261. void TransmitterSwitch::setTrackCallBack(trackCallBack cb)
  262. {
  263. if(cb == nullptr)
  264. {
  265. return;
  266. }
  267. m_trackCB = cb;
  268. }
  269. /* 点击了添加计划按钮 */
  270. void TransmitterSwitch::do_pBtnAddExecPlan()
  271. {
  272. }
  273. /* 导入数据 */
  274. void TransmitterSwitch::do_importData()
  275. {
  276. }
  277. /* 导出数据 */
  278. void TransmitterSwitch::do_exportData()
  279. {
  280. // /* 先获取所有的模板名称 */
  281. // QMap<QString, int> tabList;
  282. // m_fromWebAPI->getTemplateList(tabList);
  283. // /* 弹出导出页面 */
  284. // std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>(this);
  285. // stt->setQSS(EPUIStyle.getQSSPath());
  286. // /* 注册事件过滤器 */
  287. // stt->installEventFilter(this);
  288. // int weekDay = ui->stackedWidget_items->currentIndex();
  289. // /* 设置周几 */
  290. // stt->setWeekDay(weekDay);
  291. // /* 判断当前页是否有计划 */
  292. // if(IData.getOneDay(weekDay)->size() == 0)
  293. // {
  294. // stt->setItemEmpty(true);
  295. // }else
  296. // {
  297. // stt->setItemEmpty(false);
  298. // }
  299. // /* 判断当前是正常日还是特殊日 */
  300. // int type = -1;
  301. // if(weekDay < 7 && weekDay >= 0)
  302. // {
  303. // type = 0;
  304. // }else if(weekDay == 7)
  305. // {
  306. // type = 1;
  307. // }
  308. // /* 获取所有的模板名称,并设置 */
  309. // stt->setTemplateName(tabList, type);
  310. // stt->exec();
  311. // if(stt->isOk())
  312. // {
  313. // /* 获取一天的数据 */
  314. // auto list = IData.getOneDayExecPlan(weekDay);
  315. // /* 保存到模板 */
  316. // if(m_fromWebAPI->saveTemplate(stt->getTemplateName(), type, list))
  317. // {
  318. // TipWidget::display(TipWidget::OPERATOR_OK, "保存模版成功", this);
  319. // }else {
  320. // TipWidget::display(TipWidget::OPERATOR_FAIL, "保存模版失败", this);
  321. // }
  322. // /* 调用回调函数 */
  323. // if(m_trackCB != nullptr)
  324. // {
  325. // m_trackCB(3, g_mapTrack.value(3));
  326. // }
  327. // }
  328. }
  329. /* 清空当前页计划 */
  330. void TransmitterSwitch::do_clearCurrentPage()
  331. {
  332. /* 跳出弹窗警告 */
  333. Warning w(this);
  334. w.setQSS(EPUIStyle.getQSSPath());
  335. w.setText("是否清空当前页计划?");
  336. bool flag = false;
  337. connect(&w,&Warning::signal_ok,this,[&](){
  338. flag = true;
  339. });
  340. w.exec();
  341. if(!flag)
  342. {
  343. return;
  344. }
  345. // int weekDay = ui->stackedWidget_items->currentIndex();
  346. // IData.clearOneDay(weekDay);
  347. // sortLayout(weekDay);
  348. // LH_WRITE_LOG_DEBUG(QString("计划剩余数目:%1").arg(IData.getOneDay(weekDay)->size()));
  349. }
  350. /* 删除一个模板 */
  351. void TransmitterSwitch::do_deleteTemplate(QString name)
  352. {
  353. m_fromWebAPI->deleteTemplate(name);
  354. }
  355. /* 保存计划到EQM数据库 */
  356. void TransmitterSwitch::do_pBtn_savePlan()
  357. {
  358. /* 跳出弹窗提示 */
  359. Warning w(this);
  360. w.setQSS(EPUIStyle.getQSSPath());
  361. w.setText("将计划保存到数据库?");
  362. w.exec();
  363. if(!w.isOk())
  364. {
  365. return;
  366. }
  367. saveExecPlanToEQM();
  368. }
  369. /* 从EQM数据库获取计划 */
  370. void TransmitterSwitch::do_pBtn_getPlan()
  371. {
  372. /* 跳出弹窗提示 */
  373. Warning w(this);
  374. w.setQSS(EPUIStyle.getQSSPath());
  375. w.setText("从数据库获取计划,将清空当前所有的计划,请注意保存当前计划!");
  376. w.exec();
  377. if(!w.isOk())
  378. {
  379. return;
  380. }
  381. getExecPlanFromEQM();
  382. }
  383. /* 切换亮色/暗色外观 */
  384. void TransmitterSwitch::do_setUIStyle()
  385. {
  386. this->setStyleSheet(EPUIStyle.StrQSS_TransmitterSwitch);
  387. /* 给所有的按钮设置样式 */
  388. ui->pBtn_allFrequency->setStyleSheet(EPUIStyle.StrQSS_PBtnFrequency);
  389. // LH_WRITE_LOG(QString("频率按钮设置样式:%1").arg(EPUIStyle.StrQSS_PBtnFrequency));
  390. }
  391. /* 选择了一个频率按钮,取消其他的选择 */
  392. void TransmitterSwitch::do_selectFrequencyBtn()
  393. {
  394. /* 获取信号发送者 */
  395. auto btn = qobject_cast<QPushButton*>(sender());
  396. if(btn == nullptr)
  397. {
  398. return;
  399. }
  400. /* 判断是否是“所有频率”按钮 */
  401. bool isAllFrequency = false;
  402. if(btn != ui->pBtn_allFrequency)
  403. {
  404. ui->pBtn_allFrequency->setChecked(false);
  405. }else {
  406. isAllFrequency = true;
  407. }
  408. /* 取消其他按钮的选择 */
  409. for(auto& it : m_listFrequencyBtn)
  410. {
  411. if(it != btn)
  412. {
  413. it->setChecked(false);
  414. }
  415. }
  416. /* 设置当前按钮的选择状态 */
  417. btn->setChecked(true);
  418. /* 显示当前按钮对应的卡片,隐藏其他卡片 */
  419. showOneCard(btn);
  420. }
  421. /* 添加一个频率,包括左侧按钮和右侧卡片 */
  422. void TransmitterSwitch::createOneCard(const ChannelInfo& chnInfo)
  423. {
  424. /* 创建按钮 */
  425. QPushButton* pBtn = new QPushButton(this);
  426. pBtn->setObjectName(chnInfo.ChannelName);
  427. pBtn->setText(chnInfo.ChannelName);
  428. pBtn->setCheckable(true);
  429. pBtn->setMinimumHeight(40);
  430. PBtnUserData2* userData = new PBtnUserData2();
  431. userData->setChannelInfo(chnInfo);
  432. pBtn->setUserData(m_userData_Btn, userData);
  433. /* 设置按钮的样式表 */
  434. pBtn->setStyleSheet(EPUIStyle.StrQSS_PBtnFrequency);
  435. /* 连接信号和槽 */
  436. connect(pBtn, &QPushButton::clicked, this, &TransmitterSwitch::do_selectFrequencyBtn);
  437. m_listFrequencyBtn.push_back(pBtn);
  438. auto vLayout = qobject_cast<QVBoxLayout*>(ui->widget_frequency->layout());
  439. /* 减1是去掉最下面的弹簧 */
  440. vLayout->insertWidget(vLayout->count() - 1, pBtn);
  441. /* 创建卡片 */
  442. PlanCard* pCard = PData.createOneCard(chnInfo);
  443. m_flowlayout->addWidget(pCard);
  444. userData->setCard(pCard); /* 设置按钮的卡片指针 */
  445. /* 排序 */
  446. }
  447. /* 删除一个频率 */
  448. void TransmitterSwitch::deleteOneCard(int channelID)
  449. {
  450. /* 删除按钮 */
  451. for(auto it = m_listFrequencyBtn.begin(); it != m_listFrequencyBtn.end(); ++it)
  452. {
  453. auto userData = static_cast<PBtnUserData2*>((*it)->userData(m_userData_Btn));
  454. if(userData != nullptr && userData->getChannelInfo().ChannelID == channelID)
  455. {
  456. delete *it;
  457. m_listFrequencyBtn.erase(it);
  458. break;
  459. }
  460. }
  461. /* 删除卡片 */
  462. PData.deleteOneCard(channelID);
  463. }
  464. /* 创建所有频率卡片 */
  465. void TransmitterSwitch::createAllCard()
  466. {
  467. for(const auto& it : ChnContainer.getMapChannel())
  468. {
  469. /* 创建一个按钮和卡片 */
  470. createOneCard(it);
  471. }
  472. }
  473. /* 显示某个卡片,隐藏其他卡片 */
  474. void TransmitterSwitch::showOneCard(QPushButton *btn)
  475. {
  476. /* 判断是否是显示全部卡片的按钮 */
  477. if(btn == ui->pBtn_allFrequency)
  478. {
  479. /* 显示全部卡片 */
  480. for(auto& it : m_listFrequencyBtn)
  481. {
  482. auto ud = it->userData(m_userData_Btn);
  483. PBtnUserData2* userData = static_cast<PBtnUserData2*>(ud);
  484. if(userData != nullptr)
  485. {
  486. auto pCard = userData->getCard();
  487. if(pCard != nullptr)
  488. {
  489. pCard->show();
  490. }
  491. }
  492. }
  493. /* 设置卡片间的横向间距 */
  494. m_flowlayout->setHorizontalSpacing(m_cardHorSpacing);
  495. /* 刷新布局,刷新了才会让FlowLayout重新布局 */
  496. ui->scrollAreaContents_Card->updateGeometry();
  497. return;
  498. }
  499. /* 不是显示全部的按钮,隐藏所有卡片 */
  500. for(auto& it : m_listFrequencyBtn)
  501. {
  502. auto ud = it->userData(m_userData_Btn);
  503. PBtnUserData2* userData = static_cast<PBtnUserData2*>(ud);
  504. if(userData != nullptr)
  505. {
  506. auto pCard = userData->getCard();
  507. if(pCard != nullptr)
  508. {
  509. pCard->hide();
  510. }
  511. }
  512. }
  513. /* 显示当前卡片 */
  514. auto ud = btn->userData(m_userData_Btn);
  515. PBtnUserData2* userData = static_cast<PBtnUserData2*>(ud);
  516. if(userData != nullptr)
  517. {
  518. auto pCard = userData->getCard();
  519. if(pCard != nullptr)
  520. {
  521. pCard->show();
  522. }
  523. }
  524. /* 设置卡片间的横向间距 */
  525. m_flowlayout->setHorizontalSpacing(0);
  526. /* 刷新布局,刷新了才会让FlowLayout重新布局 */
  527. ui->scrollAreaContents_Card->updateGeometry();
  528. }
  529. /* 事件过滤器 */
  530. bool TransmitterSwitch::eventFilter(QObject *watched, QEvent *event)
  531. {
  532. if(watched == ui->label_Tip)
  533. {
  534. if(event->type() == QEvent::Enter)
  535. {
  536. m_tipText->show();
  537. return true;
  538. }else if(event->type() == QEvent::Leave)
  539. {
  540. m_tipText->hide();
  541. }
  542. }
  543. return QWidget::eventFilter(watched,event);
  544. }
  545. /* 窗口缩放事件 */
  546. void TransmitterSwitch::resizeEvent(QResizeEvent *event)
  547. {
  548. /* 设置提示文本的位置 */
  549. // if(m_tipText != nullptr)
  550. // {
  551. // QPoint pos = ui->label_Tip->mapTo(this, ui->label_Tip->pos());
  552. // m_tipText->move(pos.x() + 2, pos.y() + 2 );
  553. // }
  554. /* 设置scrollArea的大小 */
  555. int saWidth = ui->scrollArea->width() - 20 * 3;
  556. int saHeight = ui->scrollArea->height() - 20;
  557. ui->scrollArea->resize(saWidth, saHeight);
  558. ui->scrollAreaContents_Card->resize(saWidth, saHeight);
  559. ui->scrollAreaContents_Card->updateGeometry();
  560. // LH_WRITE_LOG(QString("scrollArea的大小:%1,%2").arg(saWidth).arg(saHeight));
  561. QWidget::resizeEvent(event);
  562. }