QT中使用DEBUG,cout,cin

本文介绍如何在C++中利用QTextStream类处理字符串,包括输出DEBUG信息、使用cin/cout等基本操作,并详细解释了与传统C++环境中cin/cout的区别及如何解决相关问题。

如果想输出DEBUG信息:

qDebug() << "Date:" << QDate::currentDate(); qDebug() << "Types:" << QString("String") << QChar('x') << QRect(0, 10, 50, 40); qDebug() << "Custom coordinate type:" << coordinate;
如果想使用,COUT/IN需要使用QTextStream的重载#include <QApplication> #include <QTextStream> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextStream out(stdout); out << "is QTextStream out " << endl; return app.exec(); }

其中,QTextStream是个非常好用的字符串处理类,它能够使得字符串或者是基于字符的设备、文件处理变得非常方便。
然后,就可以像正常的C++那样,在QString的环境下使用cin、cout、cerr这些类了。需要注意的一点是,这样的cin、cout、
cerr和我们在传统C++遇到的有一点不同,那就是你cout了一个QString之后,默认是不直接输出的,一般需要等到cout的缓冲区满之后,才
向终端输出内部的字符串;如果你想在cout之后马上看到输出的内容,可以在输出之后在输出一个endl,或者调用cout的内部方法flush,强制情
况缓冲区,例如:
QString str;
str = "Hello world!";
cout
cout.flush();
cin>>str;
cout


<think>我们正在开发一个没有UI的手机销售系统。根据需求,我们将使用QtCreator,但不需要图形用户界面(GUI)。因此,我们将创建一个控制台应用程序(ConsoleApplication)。步骤:1.打开QtCreator。2.选择“文件”->“新建文件或项目”->“其他项目”->“终端应用(TerminalApplication)”。3.选择项目位置和名称(例如:PhoneSalesSystem)。4.选择构建套件(Kit),通常使用默认的DesktopQt套件。5.在项目文件中,确保取消与GUI相关的模块(如QtWidgets),仅保留核心模块(如QtCore)以及可能需要的其他模块(如QtNetwork、QtSql等,根据实际需求)。6.编写代码。由于是无UI系统,我们将主要使用C++标准库以及Qt的非GUI模块(如数据库操作、网络通信等)来实现功能。示例功能:-添加手机信息-删除手机信息-修改手机信息-查询手机信息-销售手机(更新库存)我们将使用文本菜单与用户交互。下面是一个简单的代码框架:```cpp#include<QCoreApplication>#include<iostream>#include<string>#include<vector>usingnamespacestd;//手机结构体structPhone{intid;stringbrand;stringmodel;doubleprice;intstock;};//全局手机列表vector<Phone>phoneList;//添加手机voidaddPhone(){Phonep;cout<<"请输入手机品牌:";cin>>p.brand;cout<<"请输入手机型号:";cin>>p.model;cout<<"请输入手机价格:";cin>>p.price;cout<<"请输入库存数量:";cin>>p.stock;//生成ID(简单处理,实际可能从数据库获取)p.id=phoneList.size()+1;phoneList.push_back(p);cout<<"添加成功!"<<endl;}//显示所有手机voidlistPhones(){if(phoneList.empty()){cout<<"没有手机信息!"<<endl;return;}for(constauto&p:phoneList){cout<<"ID:"<<p.id<<",品牌:"<<p.brand<<",型号:"<<p.model<<",价格:"<<p.price<<",库存:"<<p.stock<<endl;}}//主菜单voidshowMenu(){cout<<"=========手机销售系统========="<<endl;cout<<"1.添加手机"<<endl;cout<<"2.显示所有手机"<<endl;cout<<"3.退出"<<endl;cout<<"请选择操作:";}intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);intchoice;do{showMenu();cin>>choice;switch(choice){case1:addPhone();break;case2:listPhones();break;case3:cout<<"谢谢使用!"<<endl;return0;default:cout<<"无效选择!"<<endl;}}while(choice!=3);returna.exec();}```注意:以上代码是一个简单的控制台程序,数据存储在内存中(使用vector),程序退出后数据会丢失。在实际应用中,我们需要将数据持久化,例如使用数据库(如SQLite)。下面我们引入SQLite数据库来存储手机信息。步骤:1.在项目文件(.pro)中添加SQL模块:`QT+=sql`2.修改代码,使用SQLite数据库。改进后的代码框架(包含数据库操作):```cpp#include<QCoreApplication>#include<QSqlDatabase>#include<QSqlQuery>#include<QSqlError>#include<iostream>#include<string>usingnamespacestd;//初始化数据库boolinitDatabase(){QSqlDatabasedb=QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("phone_sales.db");if(!db.open()){cerr<<"无法打开数据库:"<<db.lastError().text().toStdString()<<endl;returnfalse;}//创建表(如果不存在)QSqlQueryquery;query.exec("CREATETABLEIFNOTEXISTSphones(""idINTEGERPRIMARYKEYAUTOINCREMENT,""brandTEXTNOTNULL,""modelTEXTNOTNULL,""priceREALNOTNULL,""stockINTEGERNOTNULL)");returntrue;}//添加手机voidaddPhone(){stringbrand,model;doubleprice;intstock;cout<<"请输入手机品牌:";cin>>brand;cout<<"请输入手机型号:";cin>>model;cout<<"请输入手机价格:";cin>>price;cout<<"请输入库存数量:";cin>>stock;QSqlQueryquery;query.prepare("INSERTINTOphones(brand,model,price,stock)""VALUES(:brand,:model,:price,:stock)");query.bindValue(":brand",QString::fromStdString(brand));query.bindValue(":model",QString::fromStdString(model));query.bindValue(":price",price);query.bindValue(":stock",stock);if(query.exec()){cout<<"添加成功!"<<endl;}else{cerr<<"添加失败:"<<query.lastError().text().toStdString()<<endl;}}//显示所有手机voidlistPhones(){QSqlQueryquery("SELECTid,brand,model,price,stockFROMphones");if(!query.exec()){cerr<<"查询失败:"<<query.lastError().text().toStdString()<<endl;return;}if(!query.next()){cout<<"没有手机信息!"<<endl;return;}do{intid=query.value(0).toInt();stringbrand=query.value(1).toString().toStdString();stringmodel=query.value(2).toString().toStdString();doubleprice=query.value(3).toDouble();intstock=query.value(4).toInt();cout<<"ID:"<<id<<",品牌:"<<brand<<",型号:"<<model<<",价格:"<<price<<",库存:"<<stock<<endl;}while(query.next());}//主菜单(同上)intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);//初始化数据库if(!initDatabase()){return1;}//菜单循环(同上)returna.exec();}```以上代码实现了使用SQLite数据库来存储手机销售信息。你可以根据需求继续扩展功能(如删除、修改、销售等)。注意:在QtCreator中,控制台应用程序的输出在“应用程序输出”面板中查看。§§相关问题§§1.如何在QtCreator中创建控制台应用程序?2.如何将QtSQLite数据库集成到控制台应用程序中?3.如何扩展手机销售系统的功能(如删除、修改、销售手机)?4.如何将控制台应用程序打包为可执行文件?5.在无UI系统中,如何实现用户身份验证?</think>### 无UI手机销售系统的实现方案 在Qt Creator中开发无UI的手机销售系统,本质是创建一个**控制台应用程序**(Console Application)。以下是实现步骤和关键代码: #### 1. 创建控制台项目 1. 打开Qt Creator → 文件 → 新建文件或项目 2. 选择 **"其他项目"** → **"终端应用(Terminal Application)"** 3. 设置项目名称(如 `PhoneSalesSystem`)和存储路径 4. 在 `.pro` 配置文件中移除GUI模块,添加核心模块: ```qmake QT -= gui # 移除GUI模块 QT += core sql # 添加核心和数据库模块 CONFIG += console # 启用控制台 ``` #### 2. 数据库设计(SQLite示例) 创建手机库存表结构: ```sql CREATE TABLE phones ( id INTEGER PRIMARY KEY, brand TEXT NOT NULL, model TEXT NOT NULL, price REAL CHECK(price > 0), stock INTEGER DEFAULT 0 CHECK(stock >= 0), UNIQUE(brand, model) ); ``` #### 3. 核心功能实现 `main.cpp` 代码框架: ```cpp #include <QCoreApplication> #include <QSqlDatabase> #include <QSqlQuery> #include <QDebug> #include <iostream> // 数据库初始化 bool initDatabase() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("phone_sales.db"); if (!db.open()) { qCritical() << "数据库打开失败:" << db.lastError(); return false; } QSqlQuery query; query.exec("CREATE TABLE IF NOT EXISTS phones (...)"); return true; } // 添加手机库存 void addPhone(const QString &brand, const QString &model, double price, int stock) { QSqlQuery query; query.prepare("INSERT INTO phones (brand, model, price, stock) VALUES (?, ?, ?, ?)"); query.addBindValue(brand); query.addBindValue(model); query.addBindValue(price); query.addBindValue(stock); if (!query.exec()) { qWarning() << "添加失败:" << query.lastError(); } } // 销售手机 bool sellPhone(int id, int quantity) { QSqlQuery query; query.prepare("UPDATE phones SET stock = stock - ? WHERE id = ? AND stock >= ?"); query.addBindValue(quantity); query.addBindValue(id); query.addBindValue(quantity); return query.exec() && query.numRowsAffected() > 0; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); if (!initDatabase()) return 1; // 命令行交互示例 std::cout << "1. 添加库存 2. 销售手机\n选择操作: "; int choice; std::cin >> choice; if (choice == 1) { // 获取输入参数并调用addPhone() } else if (choice == 2) { // 获取输入参数并调用sellPhone() } return a.exec(); } ``` #### 4. 关键特性实现 - **库存管理**: ```cpp void updateStock(int id, int delta) { QSqlQuery query; query.prepare("UPDATE phones SET stock = stock + ? WHERE id = ?"); query.addBindValue(delta); query.addBindValue(id); query.exec(); } ``` - **销售记录**: ```sql CREATE TABLE sales ( id INTEGER PRIMARY KEY, phone_id INTEGER, quantity INTEGER, sale_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY(phone_id) REFERENCES phones(id) ); ``` - **数据查询**: ```cpp void queryStock() { QSqlQuery query("SELECT id, brand||' '||model AS name, stock FROM phones"); while (query.next()) { std::cout << query.value("id").toInt() << "\t" << query.value("name").toString().toStdString() << "\t" << query.value("stock").toInt() << "台\n"; } } ``` #### 5. 构建与部署 1. 点击Qt Creator左下角的 **▶ 运行** 按钮 2. 生成的可执行文件在 `build-项目名-<套件>/debug/` 目录 3. 命令行启动:`./PhoneSalesSystem` ### 系统设计建议 1. **数据持久化**:使用SQLite作为嵌入式数据库[^4] 2. **交互方式**: - 命令行菜单驱动 - 支持脚本化操作(如导入CSV库存) 3. **扩展性**: ```cpp // 网络服务接口(未来扩展) QObject class SalesService : public QObject { Q_OBJECT public slots: QString sellPhone(int id, int qty) { ... } }; ``` > **注意**:无UI系统需确保所有操作都有明确的命令行反馈,例如: > ``` > > 销售 iPhone13 5台 > [成功] 库存更新: iPhone13 剩余15台 > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值