Linux下postgresql.service和postgresql@.service的一点观察

在Ubuntu下用apt安装postgresql后,一般会生成两个systemctl服务(通常位于/lib/system/systemd),一个是postgresql.service,另一个是带参数的postgresql@.service,其中参数是Postgresql的大版本号。后者可以通过systemctl start postgresql@18-main.service启动,其中18是版本号,可以换成其他安装的版本。

笔者遇到的问题是,笔者将Postgresql版本从16升级到了18(用的同样的配置同样的端口号),但想保留16一段时间以防万一。于是在升级时简单用systemctl stop postgresql@16-main.servicesystemctl stop postgresql@18-main.service简单地切换了下。但笔者的机器断电了一次,重启后一些依赖数据库的其他服务都挂了。于是进行了研究,发现开机自动重启的是16版本。

经过仔细研究,笔者发现

  • Ubuntu安装Postgresql后,注册的开机启动服务其实是postgresql.service,并不是具体指向版本的postgresql@16-main.service或者postgresql@18-main.service;

Read More

vcpkg配置笔记

记录下笔者vcpkg配置以及和CMake联动方法。

获取

在适当的地方克隆一个vcpkg仓库,并初始化

1
2
3
git clone git@github.com:microsoft/vcpkg.git
.\bootstrap-vcpkg.bat # Windows or
./bootstrap-vcpkg.sh # *inx-like

这会下载vcpkg.exe,如果被GFW阻拦,可以自己下载然后放到对应目录。

Read More

Qt6免继承实现QTableWidget右键菜单

通过事件过滤器(eventFilter)来实现右键菜单并显示行号。这种方法更加灵活,适合在已有的 QTableWidget 上添加功能,而无需修改或继承它。

以下是完整的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <QApplication>
#include <QTableWidget>
#include <QMenu>
#include <QContextMenuEvent>
#include <QMessageBox>
#include <QHBoxLayout>
#include <QWidget>

int main(int argc, char *argv[]) {
QApplication app(argc, argv);

// 创建主窗口
QWidget window;
QHBoxLayout *layout = new QHBoxLayout(&window);

// 创建 QTableWidget
QTableWidget *tableWidget = new QTableWidget(5, 3);
tableWidget->setHorizontalHeaderLabels({"Column 1", "Column 2", "Column 3"});

// 填充一些数据
for (int row = 0; row < 5; ++row) {
for (int col = 0; col < 3; ++col) {
QTableWidgetItem *item = new QTableWidgetItem(tr("Item %1-%2").arg(row).arg(col));
tableWidget->setItem(row, col, item);
}
}

// 将 QTableWidget 添加到布局中
layout->addWidget(tableWidget);
window.setLayout(layout);

// 安装事件过滤器
tableWidget->viewport()->installEventFilter(&window);

// 事件过滤器实现
window.installEventFilter(tableWidget);
QObject::connect(tableWidget, &QTableWidget::customContextMenuRequested, [tableWidget](const QPoint &pos) {
QTableWidgetItem *item = tableWidget->itemAt(pos);
if (item) {
int row = item->row();

// 创建右键菜单
QMenu menu;
QAction *showRowAction = menu.addAction(tr("Show Row Number"));
QObject::connect(showRowAction, &QAction::triggered, [row]() {
QMessageBox::information(nullptr, tr("Row Number"), tr("You clicked on row: %1").arg(row));
});

// 显示菜单
menu.exec(tableWidget->viewport()->mapToGlobal(pos));
}
});

// 启用右键菜单
tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);

window.show();
return app.exec();
}

代码说明:

Read More

嵌入的Qt对话框输入一些东西相关(.exec/.show etc)

基本框架

1
2
3
4
5
6
7
8
9
10
11
12
13

# some content load from remote data service
# ... code ignored ...

app = QApplication([])
dialog = ContentEditDialog(original_content)
dialog.exec()
# dialog.show()
# app.exec()

updated_content = dialog.collect_edited_content()

print(updated_content)
  • 只有dialog.exec():程序阻塞,编辑生效。
  • 只有dialog.show(): 程序不阻塞,对话框一闪即逝,无法编辑。
Read More