C/C++ Qt 数据库与ComBox多级联动
Qt中的SQL数据库组件可以与ComBox组件形成多级联动效果,在日常开发中多级联动效果应用非常广泛,例如当我们选择指定用户时,我们让其在另一个ComBox组件中列举出该用户所维护的主机列表,又或者当用户选择省份时,自动列举出该省份下面的城市列表等。
今天给大家分享二级ComBox菜单如何与数据库形成联动,在进行联动之前需要创建两张表,表结构内容介绍如下:
- User表:存储指定用户的ID号与用户名
- UserAddressList表:与User表中的用户名相关联,存储该用户所管理的主机列表信息
void InitMultipleSQL()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
{
std::cout << db.lastError().text().toStdString()<< std::endl;
return;
}
// 执行SQL创建User表并插入测试数据
// https://www.cnblogs.com/lyshark
db.exec("DROP TABLE User");
db.exec("CREATE TABLE User ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL)"
);
db.exec("INSERT INTO User(name) VALUES('lyshark')");
db.exec("INSERT INTO User(name) VALUES('root')");
db.exec("INSERT INTO User(name) VALUES('admin')");
// 创建第二张表,与第一张表通过姓名关联起来
db.exec("DROP TABLE UserAddressList");
db.exec("CREATE TABLE UserAddressList("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL, "
"address VARCHAR(128) NOT NULL"
")");
db.exec("INSERT INTO UserAddressList(name,address) VALUES ('lyshark','192.168.1.1')");
db.exec("INSERT INTO UserAddressList(name,address) VALUES ('lyshark','192.168.1.2')");
db.exec("INSERT INTO UserAddressList(name,address) VALUES ('lyshark','192.168.1.3')");
db.exec("INSERT INTO UserAddressList(name,address) VALUES ('root','192.168.10.10')");
db.exec("INSERT INTO UserAddressList(name,address) VALUES ('root','192.168.10.11')");
db.exec("INSERT INTO UserAddressList(name,address) VALUES ('admin','192.168.100.100')");
db.commit();
db.close();
}
初始化表结构以后就得到了两张表,当程序运行时默认在构造函数处填充第一个ComBox组件,也就是执行一次数据库查询,并将结果通过ui->comboBox_1->addItem();放入到第一个组件内。
QSqlDatabase db;
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitMultipleSQL();
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
{
std::cout << db.lastError().text().toStdString()<< std::endl;
return;
}
QSqlQuery query;
query.exec("select * from User;");
QSqlRecord rec = query.record();
while(query.next())
{
int index_name = rec.indexOf("name");
QString data_name = query.value(index_name).toString();
ui->comboBox->addItem(data_name);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
代码运行后第一个ComBox会显示所有用户名:

此时回到UI编辑界面,我们在第一个ComBox上转到槽函数on_comboBox_activated(const QString &arg1)上面。

当用户选择第一个ComBox选择框时,自动查询数据库中与该选择框对应的字段,并关联到第二个选择框内,代码如下:
void MainWindow::on_comboBox_activated(const QString &arg1)
{
std::cout << "www.lyshark.com Name = " << arg1.toStdString()<<std::endl;
if(db.open())
{
QSqlQuery query;
query.prepare("select * from UserAddressList where name = :x");
query.bindValue(":x",arg1);
query.exec();
QSqlRecord rec = query.record();
ui->comboBox_2->clear();
while(query.next())
{
int index = rec.indexOf("address");
QString data_ = query.value(index).toString();
ui->comboBox_2->addItem(data_);
}
}
}
最终关联效果如下,当选择用户是自动关联到所维护的主机列表上面:

C/C++ Qt 数据库与ComBox多级联动的更多相关文章
- C/C++ Qt 数据库与TableView多组件联动
Qt 数据库组件与TableView组件实现联动,以下案例中实现了,当用户点击并选中TableView组件内的某一行时,我们通过该行中的name字段查询并将查询结果关联到ListView组件内,同时将 ...
- Java基于POI实现excel任意多级联动下拉列表——支持从数据库查询出多级数据后直接生成【附源码】
Excel相关知识点 (1)名称管理器--Name Manager [CoderBaby]首先需要创建多个名称(包含key及value),作为下拉列表的数据源,后续通过名称引用.可通过菜单:&quo ...
- PHP多级联动的学习(一)
我尝试在ThinkCMF中实现多级联动,首先我开始看了dede的联动类别管理前后台的代码以及他的数据库,经过非常多次的尝试,我渐渐有了一点想法,并给予实施. 首先写出前台的界面.如图. 然后在数据库中 ...
- 【Asp.Net使用EasyUI】EasyUI combox实现联动
很多时候都会用到combox的联动效果,选择上一个combox的值就自动带出这个值对应的其它信息,比如省市联动,最近我也刚好遇到了类似的要求,是用EasyUI combobox 控件完成的,如果是A ...
- JavaScript 多级联动浮动(下拉)菜单 (第二版)
JavaScript 多级联动浮动(下拉)菜单 (第二版) 上一个版本(第一版请看这里)基本实现了多级联动和浮动菜单的功能,但效果不是太好,使用麻烦还有些bug,实用性不高.这次除了修改已发现的问 ...
- MVC实现多级联动
前言 多级联动(省级联动)的效果,网上现成的都有很多,各种JS实现,Jquery实现等等,今天我们要讲的是在MVC里面,如何更方便.更轻量的实现省级联动呢? 实现效果如下: 具体实现 如图所示,在HT ...
- js 多级联动(省、市、区)
js 多级联动(省.市.区) CreateTime--2018年4月9日17:10:38 Author:Marydon 方式一: 数据从数据库获取,ajax实现局部刷新 方式二: 数据从json文 ...
- 在excel实现多级联动
最近做了一个Excel的多级联动的功能,具体是将全国所有的气象局按一二三四级单位做成四列,实现各级的联动下拉选择,这和省市县乡的各级联动的功能基本一样,下面记录下具体的操作步骤. 1.首先需要从数据库 ...
- 微信小程序-多级联动
微信小程序中的多级联动 这里用到的案例是城市选择器 先上代码: .wxml <view class="{{boxHide}}"> <view>{{nian} ...
随机推荐
- Spring Security 的注册登录流程
Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...
- Nginx(三):Linux环境(Ubuntu)下Nginx的安装
Nginx 是一位俄罗斯人 Igor Sysoev(伊戈尔·塞索斯夫)编写的一款高性能HTTP和反向代理服务器. Nginx 主要是有C编写的,安装Nginx需要GCC编译器(GNU Compiler ...
- 还在用canvas画格子吗?文字烟花效果更不错噢
大家好,我是小丞同学,一名前端爱好者 欢迎访问博主的个人网站:一口奶盖 "在人间贩卖声音 等凑够满天星辰 放烟花给你看" 上次的烟花有些许平淡,这次来放大招了,让你的名字在天空绽放 ...
- readelf
readelf的help内容如下所示: Usage: readelf <option(s)> elf-file(s) Display information about the conte ...
- JAVA笔记12__字节、字符缓冲流/打印流/对象流/
/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...
- .net C# 释放内存 例子
namespace myCommon{ public class SysVar { [DllImport("kernel32.dll")] public ...
- 使用jiava打印一个三角形
public class ForDemo { public static void main(String[] args) { /* 打印一个5行高的三角形,首先将三角形分成三部分: 第一部分是前面的 ...
- Java_map
1 package Test; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class MapTest { 7 p ...
- 单元测试NUnit,mock组件NSubstitute,信号量SemaphoreSlim,异步lock等例子
public class LockTest { private IDatabase _database; private readonly Random _random = new Random(); ...
- [cf461E]Appleman and a Game
考虑我的每一次添加操作,要满足:1.该串是t的子串:2.该串不能与下一次的串开头字母构成t的子串.那么,设f[i][j][k]表示拼i次,第i次填入的开头字母是j,第i+1填入的开头字母是k的最短长度 ...