小组件
将窗体变为顶级窗口
调用以下方法即可:
void QWidget::activateWindow();
QTableWidget
QTableWidget 是一个表格小部件,继承自 QTableView,QTableWidget 的行索引和列索引 都是从零开始
清空 tableWidget 有个简单的方式是调用 setRow(0),但是这种方式会造成 内存泄漏 ,最好的方式是调用:
|
处理选中的行
获取选中的行,然后读取第二列的单元格名字,然后执行相关命令:
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()
。