sequenceselectorwidget.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "sequenceselectorwidget.h"
  2. #include <QApplication>
  3. #include <QDebug>
  4. #include <QHeaderView>
  5. #include <QLabel>
  6. #include <QMessageBox>
  7. #include <QScreen>
  8. #include "dragdroptablewidget.h"
  9. SequenceSelectorWidget::SequenceSelectorWidget(const QStringList &pcSnList, QWidget *parent)
  10. : QDialog(parent), m_pcSnList(pcSnList) {
  11. setupUI();
  12. populateTable();
  13. centerOnScreen();
  14. }
  15. SequenceSelectorWidget::~SequenceSelectorWidget() {}
  16. void SequenceSelectorWidget::setupUI() {
  17. setWindowTitle("起爆顺序设置");
  18. setFixedSize(440, 550);
  19. setModal(true);
  20. // Create main layout with margins
  21. QVBoxLayout *mainLayout = new QVBoxLayout(this);
  22. mainLayout->setContentsMargins(20, 20, 20, 20);
  23. mainLayout->setSpacing(15);
  24. // Create our custom table widget
  25. m_tableWidget = new DragDropTableWidget(this);
  26. m_tableWidget->setShowGrid(true);
  27. // Set up the table - keep all original logic
  28. m_tableWidget->setColumnCount(2);
  29. QStringList headers;
  30. headers << "序号" << "井下起爆器";
  31. m_tableWidget->setHorizontalHeaderLabels(headers);
  32. // Additional properties specific to our needs
  33. m_tableWidget->setColumnWidth(0, 80);
  34. // Add table to main layout
  35. mainLayout->addWidget(m_tableWidget);
  36. // Create button layout
  37. QHBoxLayout *buttonLayout = new QHBoxLayout();
  38. m_confirmButton = new QPushButton("确认", this);
  39. m_cancelButton = new QPushButton("取消", this);
  40. m_confirmButton->setStyleSheet(
  41. "QPushButton {"
  42. " background-color: #007ACC;"
  43. " color: white;"
  44. " border: none;"
  45. " padding: 8px 16px;"
  46. " border-radius: 4px;"
  47. " font-size: 14px;"
  48. "}"
  49. "QPushButton:hover {"
  50. " background-color: #005A9E;"
  51. "}"
  52. "QPushButton:pressed {"
  53. " background-color: #004578;"
  54. "}");
  55. m_cancelButton->setStyleSheet(
  56. "QPushButton {"
  57. " background-color: #6C757D;"
  58. " color: white;"
  59. " border: none;"
  60. " padding: 8px 16px;"
  61. " border-radius: 4px;"
  62. " font-size: 14px;"
  63. "}"
  64. "QPushButton:hover {"
  65. " background-color: #545B62;"
  66. "}"
  67. "QPushButton:pressed {"
  68. " background-color: #3D4449;"
  69. "}");
  70. buttonLayout->addStretch();
  71. buttonLayout->addWidget(m_confirmButton);
  72. buttonLayout->addWidget(m_cancelButton);
  73. // Add button layout to main layout
  74. mainLayout->addLayout(buttonLayout);
  75. // Connect signals
  76. connect(m_confirmButton, &QPushButton::clicked, this, &SequenceSelectorWidget::onConfirmClicked);
  77. connect(m_cancelButton, &QPushButton::clicked, this, &SequenceSelectorWidget::onCancelClicked);
  78. // Connect our custom drag-drop signal
  79. connect(m_tableWidget, &DragDropTableWidget::rowDropped, this, &SequenceSelectorWidget::handleRowDropped);
  80. }
  81. void SequenceSelectorWidget::populateTable() {
  82. m_tableWidget->clearContents();
  83. m_tableWidget->setRowCount(m_pcSnList.size());
  84. qDebug() << "draw" << m_pcSnList;
  85. for (int i = 0; i < m_pcSnList.size(); ++i) {
  86. // Sequence number
  87. QTableWidgetItem *sequenceItem = new QTableWidgetItem(QString::number(i + 1));
  88. sequenceItem->setTextAlignment(Qt::AlignCenter);
  89. sequenceItem->setFlags(sequenceItem->flags() & ~Qt::ItemIsEditable);
  90. m_tableWidget->setItem(i, 0, sequenceItem);
  91. // PcSn
  92. QTableWidgetItem *pcSnItem = new QTableWidgetItem(m_pcSnList[i]);
  93. pcSnItem->setTextAlignment(Qt::AlignCenter);
  94. pcSnItem->setFlags(pcSnItem->flags() & ~Qt::ItemIsEditable);
  95. m_tableWidget->setItem(i, 1, pcSnItem);
  96. }
  97. }
  98. QStringList SequenceSelectorWidget::getOrderedPcSnList() const {
  99. QStringList orderedList;
  100. for (int i = 0; i < m_tableWidget->rowCount(); ++i) {
  101. QTableWidgetItem *item = m_tableWidget->item(i, 1);
  102. if (item) {
  103. orderedList << item->text();
  104. }
  105. }
  106. return orderedList;
  107. }
  108. void SequenceSelectorWidget::onConfirmClicked() {
  109. QStringList orderedPcSnList = getOrderedPcSnList();
  110. emit startFiring(orderedPcSnList);
  111. accept();
  112. }
  113. void SequenceSelectorWidget::onCancelClicked() {
  114. emit cancel();
  115. reject();
  116. }
  117. void SequenceSelectorWidget::centerOnScreen() {
  118. QScreen *screen = QApplication::primaryScreen();
  119. if (screen) {
  120. QRect screenGeometry = screen->geometry();
  121. int x = (screenGeometry.width() - width()) / 2;
  122. int y = (screenGeometry.height() - height()) / 2;
  123. move(x, y);
  124. }
  125. }
  126. void SequenceSelectorWidget::handleRowDropped(int fromRow, int toRow) {
  127. qDebug() << "Row dropped from" << fromRow << "to" << toRow;
  128. if (fromRow == toRow) {
  129. return;
  130. }
  131. // 获取当前所有数据
  132. QStringList pcSnList;
  133. for (int i = 0; i < m_tableWidget->rowCount(); ++i) {
  134. QTableWidgetItem *item = m_tableWidget->item(i, 1);
  135. if (item) {
  136. pcSnList << item->text();
  137. }
  138. }
  139. if (toRow >= pcSnList.size()) {
  140. toRow = pcSnList.size() - 1; // 确保不越界
  141. }
  142. // Store the dragged row data
  143. QString draggedSn = m_tableWidget->item(fromRow, 1)->text();
  144. pcSnList.removeAt(fromRow);
  145. pcSnList.insert(toRow, draggedSn);
  146. m_pcSnList = pcSnList;
  147. qDebug() << "Updated PcSnList:" << m_pcSnList;
  148. populateTable();
  149. // Make sure the table maintains selection on the moved row
  150. // m_tableWidget->selectRow(toRow);
  151. }