小组件

将窗体变为顶级窗口

调用以下方法即可:

void QWidget::activateWindow();

QTableWidget

QTableWidget 是一个表格小部件,继承自 QTableView,QTableWidget 的行索引和列索引 都是从零开始

清空 tableWidget 有个简单的方式是调用 setRow(0),但是这种方式会造成 内存泄漏 ,最好的方式是调用:

for(int row = tbl->rowCount() - 1; row >= 0; row--) {
   tbl->removeRow(row);
}

处理选中的行

获取选中的行,然后读取第二列的单元格名字,然后执行相关命令:

connect(ui_->btn_start, &QPushButton::clicked, [this]() {
   auto items = ui_->tableWidget->selectedItems();
   if(items.empty()) return;

   std::set<std::string> groups;
   for(auto const& i: items) {
      auto group = ui_->tableWidget->item(i->row(), 2)->text();
      groups.insert(group.toStdString());
   }

   spdlog::info("启动进程组 {}", groups);

   for(auto const& group: groups) {
      this->Start(group);
   }
});

设置选中的行

当点击 hostName 列时,自动选中所有 HostName 相同的行:

void InfoWindow::spanHostName(const QString& hostName) {
   if(hostName.isEmpty()) return;
   spdlog::trace("拓展选择 HostName {}", hostName.toStdString());
   // 主机名是第一列
   int rows = ui_->tableWidget->rowCount();

   bool flag = false;
   for(int i = 0; i < rows; ++i) {
      auto cellHostName = ui_->tableWidget->item(i, 1)->text();
      spdlog::info("hostname 为 {}", cellHostName.toStdString());
      if(cellHostName != hostName) continue;

      if(!flag) {
          flag = true;
          ui_->tableWidget->clearSelection();
          selectedHostName_ = hostName;
          selectedGroupname_.clear();
      }
       ui_->tableWidget->setRangeSelected({ i, 0, i, 4 }, true);
   }
}

设置单元格颜色

根据单元格的值设置颜色:

auto cell   = ui_->tableWidget->item(rowIdx, 3);
auto alived = row.at(3) == "是" ? true : false;
if(alived) {
    cell->setBackground(Qt::green);
} else {
    cell->setBackground(Qt::red);
}

QTableView

QTableView 的配套 model 是 QStandardItemModel,proxy 为 QSortFilterProxyModel。一次正确的数据流转为:

graph TD

A[model] -→ B[proxy] B -→ C[view1] B -→ D[view2] B -→ E[view2]

例如:

auto model = new QStandardItemModel(this);
auto proxy = new QSortFilterProxyModel(this);
auto view  = new QTableView(this);

proxy->setSourceModel(model);
view->setModel(proxy);

设置表头

model->setHorizontalHeaderItem(HeaderName::ProcName, new QStandardItem("进程名"));
model->setHorizontalHeaderItem(HeaderName::HostName, new QStandardItem("主机名"));
model->setHorizontalHeaderItem(HeaderName::ProcGroup, new QStandardItem("进程组"));
model->setHorizontalHeaderItem(HeaderName::isAlived, new QStandardItem("进程存活状态"));
model->setHorizontalHeaderItem(HeaderName::VIP, new QStandardItem("虚拟 IP"));

设置排序

view->sortByColumn(HeaderName::HostName, Qt::SortOrder::AscendingOrder);

设置过滤

proxy->sortByColumn(HeaderName::HostName, Qt::SortOrder::AscendingOrder);
proxy->setFilterRegExp(QRegExp("sxs-(51)|(52)|(53)|(54)|(55)"));

状态栏

要显示一条消息,使用 showMessage 方法。但是这个 message 不会对 html 代码解析。如果需要央视,需要直接修改样式表。例如:

statusBar()->setStyleSheet("color: blue");
statusBar()->showMessage("More Text!");

QScrollArea

QScrollArea 及其子类:QTextEdit, QTextBrowser 如果需要获取事件,安装事件过滤器的对象应当是 scrollarea→viewport()

Last moify: 2023-02-04 01:10:56
Build time:2025-07-18 09:41:42
Powered By asphinx