那位大神知QT俄罗斯老太婆granny80游戏能开户吗

使用Qt图形框架开发俄罗斯方块 - JerryZone
在这个站点登录
保存我的登录记录
打赏支付方式:
喵,给Po主家猫买罐猫粮吧(~ ̄▽ ̄)~
捐赠JerryZone
微信:JCoding
GitHub:jerry-yuan
展开分类目录
Qt作为一个图形库拥有着大量的成功案例,其中也不乏一些非常出色的游戏。
使用QT制作俄罗斯方块便是非常不错的选择。
1.总体概述
俄罗斯方块《俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。
同时《俄罗斯方块》也是一款电视游戏机和掌上游戏机游戏。
《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
俄罗斯方块是我们最熟悉不过的一款休闲类小游戏,自从它被发明以来,在各个终端也是有诸多的实例。作为一款经久不衰的一款小游戏,也是受到了软件开发人员的青睐,将这款小游戏作为了一个软件编程入门的小实例。可以说,作为一个软件开发者,这款小游戏是不得不会的一个小例子。
俄罗斯方块在游戏规则上非常简单,在10×20的舞台上,自动添加一个图形并自上向下移动,直至下方存在图形无法下落,之后再次添加一个新的图形。当无法添加图形的时候,认为游戏结束。
本文将会从核心游戏逻辑、显示舞台、分数计算、多线程图形绘制、图形碰撞检测、图形变换六个方面来进行详解。
2.图形界面
首先是一个舞台(QWidget)用于显示和游戏内容相关的图形,另外是一个用于显示下一个图形的窗口(QWidget),下方是一个开始游戏的入口按钮。
&?xml version=&1.0& encoding=&UTF-8&?&
&ui version=&4.0&&
&class&MainWindow&/class&
&widget class=&QMainWindow& name=&MainWindow&&
&property name=&geometry&&
&width&275&/width&
&height&350&/height&
&/property&
&property name=&minimumSize&&
&width&275&/width&
&height&350&/height&
&/property&
&property name=&maximumSize&&
&width&275&/width&
&height&350&/height&
&/property&
&property name=&windowTitle&&
&string&俄罗斯方块&/string&
&/property&
&property name=&windowIcon&&
&iconset resource=&Icons.qrc&&
&normaloff&:/main.png&/normaloff&:/main.png&/iconset&
&/property&
&property name=&styleSheet&&
&string notr=&true&/&
&/property&
&widget class=&QWidget& name=&centralWidget&&
&layout class=&QHBoxLayout& name=&horizontalLayout_2&&
&layout class=&QVBoxLayout& name=&verticalLayout_2&&
&widget class=&QWidget& name=&stage& native=&true&&
&property name=&sizePolicy&&
&sizepolicy hsizetype=&Fixed& vsizetype=&Fixed&&
&horstretch&0&/horstretch&
&verstretch&0&/verstretch&
&/sizepolicy&
&/property&
&property name=&minimumSize&&
&width&161&/width&
&height&321&/height&
&/property&
&property name=&maximumSize&&
&width&161&/width&
&height&321&/height&
&/property&
&property name=&styleSheet&&
&string notr=&true&&QWidget{
border:1px solid #000;
background-color:#000;
}&/string&
&/property&
&spacer name=&verticalSpacer_3&&
&property name=&orientation&&
&enum&Qt::Vertical&/enum&
&/property&
&property name=&sizeHint& stdset=&0&&
&width&20&/width&
&height&40&/height&
&/property&
&layout class=&QVBoxLayout& name=&verticalLayout&&
&layout class=&QHBoxLayout& name=&horizontalLayout&&
&spacer name=&horizontalSpacer_2&&
&property name=&orientation&&
&enum&Qt::Horizontal&/enum&
&/property&
&property name=&sizeType&&
&enum&QSizePolicy::Minimum&/enum&
&/property&
&property name=&sizeHint& stdset=&0&&
&width&0&/width&
&height&20&/height&
&/property&
&widget class=&QWidget& name=&Tip& native=&true&&
&property name=&minimumSize&&
&width&65&/width&
&height&65&/height&
&/property&
&property name=&maximumSize&&
&width&65&/width&
&height&65&/height&
&/property&
&property name=&styleSheet&&
&string notr=&true&&
border:1px solid #000;
background-color:#000;
&/property&
&spacer name=&horizontalSpacer&&
&property name=&orientation&&
&enum&Qt::Horizontal&/enum&
&/property&
&property name=&sizeType&&
&enum&QSizePolicy::Minimum&/enum&
&/property&
&property name=&sizeHint& stdset=&0&&
&width&0&/width&
&height&20&/height&
&/property&
&spacer name=&verticalSpacer_4&&
&property name=&orientation&&
&enum&Qt::Vertical&/enum&
&/property&
&property name=&sizeType&&
&enum&QSizePolicy::Fixed&/enum&
&/property&
&property name=&sizeHint& stdset=&0&&
&width&20&/width&
&height&20&/height&
&/property&
&widget class=&QLabel& name=&Score&&
&property name=&text&&
&string&点击开始游戏&/string&
&/property&
&spacer name=&verticalSpacer_2&&
&property name=&orientation&&
&enum&Qt::Vertical&/enum&
&/property&
&property name=&sizeHint& stdset=&0&&
&width&20&/width&
&height&40&/height&
&/property&
&widget class=&QPushButton& name=&StartGame&&
&property name=&text&&
&string&开始游戏&/string&
&/property&
&spacer name=&verticalSpacer&&
&property name=&orientation&&
&enum&Qt::Vertical&/enum&
&/property&
&property name=&sizeHint& stdset=&0&&
&width&20&/width&
&height&40&/height&
&/property&
&spacer name=&horizontalSpacer_3&&
&property name=&orientation&&
&enum&Qt::Horizontal&/enum&
&/property&
&property name=&sizeType&&
&enum&QSizePolicy::Expanding&/enum&
&/property&
&property name=&sizeHint& stdset=&0&&
&width&40&/width&
&height&20&/height&
&/property&
&layoutdefault spacing=&6& margin=&11&/&
&resources&
&include location=&Icons.qrc&/&
&/resources&
&connections/&
因为前面的舞台中将会有200个方块,后面的窗口中将会有16个方块,数量巨大,使用QtCreator中的图形界面绘制工具直接绘制工作量过于巨大,所以在这里使用了空置这两个QWidget,之后再在结构函数中生成应当存在的QLabel。同时,如果之前使用Qt Creator绘制完成舞台和窗口,将会在调用其中内容时候因为命名的问题产生相当大的工作量。
3.显示舞台
首先是整体数据结构:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include &QLabel&
#include &QTimer&
#include &QMainWindow&
namespace Ui {
class MainW
class MainWindow : public QMainWindow{
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void keyPressEvent(QKeyEvent *event); //按键事件处理
private slots:
void gameEvent();
//timer槽函数
void on_StartGame_clicked();
//开始游戏槽函数
Ui::MainWindow *
QLabel *stage[20][10];
//高20宽10:舞台
QLabel *tipBox[4][4];
//高4宽4提示窗口
int _stageContent[20][10];
//纯数字舞台
//7种图形4个方向4个高4个宽
int _shapes[7][4][4][4]={{{{1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}},{{{0,1,1,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}},{{0,1,1,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}},{{{1,1,0,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},{{1,1,1,0},{1,0,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,0,0,0},{1,1,0,0},{0,0,0,0}},{{0,0,1,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}}},{{{1,1,0,0},{1,0,0,0},{1,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{0,1,0,0},{1,1,0,0},{0,0,0,0}},{{1,1,1,0},{0,0,1,0},{0,0,0,0},{0,0,0,0}}},{{{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},{{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},{{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}}},{{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}}},{{{0,0,0,0},{1,1,1,0},{0,1,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}}};
int _x=3,_y=0;//当前图形位置00位置
int nextShape,currentS //下一个图形,当前图形
int nextPos,currentP
//下一个图形姿态,当前图形姿态
//图形锁定变量
int Score=0;
//当前分数
void lockShape();
//锁定图形
bool shapeLocked();
//判断是否锁定
void unlockShape();
//解锁图形
bool hitTest(int x, int y, int xshift, int yshift, int shape, int pos);//碰撞检测
bool downOK();
//图形是否可以下落
bool leftOK();
//是否可以左移
bool rightOK();
//是否可以右移
bool switchOK();
//是否可以变换
bool addOK();
//是否可以添加
void clearOldBlock();
//清除旧图形
void putNewBlock();
//添加新图形
void randomShape();
//随机下一个
void addShape();
//添加图形
void drawStage();
//绘制舞台
void dropShape();
//图形下落
void leftShape();
//图形左移
void rightShape();
//图形右移动
void switchShape();
//图形变换
void calculateScore();
//消除并计算分数
void shiftRow(int row);
//消除某行
#endif // MAINWINDOW_H
在这里,需要将7种图形
这里为了方便操作,舞台使用QLabel作为每一个方块,每个方块的大小为15px×15px,并使用一个二维数组对应每个方块的有无颜色(0为无,1为有),同时,使用drawStage()函数来同步数组和舞台的显示。
#include &MainWindow.h&
//绘制舞台
void MainWindow::drawStage(){
for(int i=0;i&20;i++){
for(int j=0;j&10;j++){
//当舞台映射中为1时,对应的QLabel设定为有色,否则为无色
if(_stageContent[i][j]){
stage[i][j]-&setStyleSheet(&border:0background:#5709A8&);
stage[i][j]-&setStyleSheet(&border:0background:#FFF&);
这里用到了CSS来规定方块的颜色。
4.图形碰撞检测
图形碰撞检测是俄罗斯方块中最复杂的一部分。当用户输入一个移动指令,游戏需要检验此操作是否可行;当游戏自动执行下降时,需要判断是否可以下降;当添加一个图形时,需要判断是否存在空间添加新的图形;当图形变换时,判断是否可以进行变换。
#include &MainWindow.h&
#include &QDebug&
//可以下落
bool MainWindow::downOK(){
//判断y向下偏移一个是否可以添加图形
return !hitTest(_x,_y,0,1,currentShape,currentPos);
//是否可以左移
bool MainWindow::leftOK(){
//判断x减少一个是否可以添加图形
return !hitTest(_x,_y,-1,0,currentShape,currentPos);
//是否可以右移
bool MainWindow::rightOK(){
//判断x增加一个是否可以添加图形
return !hitTest(_x,_y,1,0,currentShape,currentPos);
//是否可以变换
bool MainWindow::switchOK(){
int _pos=currentPos+1;
if(_pos&3) _pos=0;
return !hitTest(_x,_y,0,0,currentShape,_pos);
//是否可以添加
bool MainWindow::addOK(){
//添加直接添加即可,不存在旧图形,所以无法使用hitTest函数
for(int i=0;i&4;i++)
for(int j=0;j&4;j++)
if(_stageContent[i][3+j]&&_shapes[nextShape][nextPos][i][j])
//碰撞检测
bool MainWindow::hitTest(int x, int y,int xshift,int yshift, int shape, int pos){
int _s[20][10]; //用户试验的舞台映射
//用于存储重叠方块数量的变量
memcpy(_s,_stageContent,sizeof(_stageContent)); //拷贝舞台
//首先将已有的旧图形去除
for(int i=0;i&4;i++)
for(int j=0;j&4;j++)
if(_shapes[shape][pos][i][j]) {
_s[y+i][x+j]=0;
//尝试进行图形的更改,并统计会之后是否有重叠(即有重叠)
for(int i=0;i&4;i++)
for(int j=0;j&4;j++)
if(_shapes[shape][pos][i][j]){
//此处判断一下边界
if(x+j+xshift&0||x+j+xshift&9||y+i+yshift&0||y+i+yshift&19) {
//重叠计数
test=_s[y+i+yshift][x+j+xshift]+_shapes[shape][pos][i][j];
//一旦发现重叠即可返回
if(test&1)
5.图形变换
当经过了图形碰撞检测之后,需要将图形进行对应的变换,从而实现图形的变化。
经过分析,我发现不管对于哪一种变换,总体的算法思路都是先去除旧的图形,对图形进行变换,绘制新的图形。所以四种变换(左移,右移,下移,旋转)整体结构都是相同的。
#include &MainWindow.h&
void MainWindow::dropShape(){
while(shapeLocked());
lockShape();
clearOldBlock();
putNewBlock();
unlockShape();
void MainWindow::leftShape(){
while(shapeLocked());
lockShape();
clearOldBlock();
putNewBlock();
unlockShape();
void MainWindow::rightShape(){
while(shapeLocked());
lockShape();
clearOldBlock();
putNewBlock();
unlockShape();
void MainWindow::switchShape(){
while(shapeLocked());
lockShape();
clearOldBlock();
currentPos++;
currentPos=currentPos&3?0:currentP
putNewBlock();
unlockShape();
//清除旧图形
void MainWindow::clearOldBlock(){
for(int i=0;i&4;i++)
for(int j=0;j&4;j++)
if(_shapes[currentShape][currentPos][i][j]) _stageContent[_y+i][_x+j]=0;
//添加新图形
void MainWindow::putNewBlock(){
for(int i=0;i&4;i++)
for(int j=0;j&4;j++)
if(_shapes[currentShape][currentPos][i][j]) _stageContent[_y+i][_x+j]=1;
6.多线程图形绘制
QT本身是一个调用系统API实现多线程的图形化框架。多线程有一个非常重要的特点就是CPU资源随机分配。对于多个线程,下一个CPU指令遵循哪一个线程的指令将会是不确定的。然而在俄罗斯方块中,不管是哪一个方块的图形变换,都是需要多个CPU指令才能够完成,所以上面的几个函数必须要等到当前已经开始的变换函数完全执行结束后才能够开始对舞台映射数组进行操作,否则将会出现图形残留或者无法正确变换。
在Java中,Java本身支持多线程编程,所以保留了synchronize关键字用于多线程中的同步问题。在网上经过了一些查阅,我并没有找到关于Qt中多线程的线程同步的一些方法,所以就采用了一个标记变量用于标记当前是否存在正在执行的图形,如果存在,既不能提前结束函数(假设是玩家提出的图形变换命令,那么表现出来就是没有反应),也不能继续执行,所以采用了一个while循环将函数暂停。
#include &MainWindow.h&
bool MainWindow::shapeLocked(){
void MainWindow::lockShape(){
void MainWindow::unlockShape(){
7.核心游戏逻辑
根据游戏的逻辑,可以得出下面的代码:
#include &MainWindow.h&
#include &ui_MainWindow.h&
#include &QDateTime&
#include &QDebug&
#include &QKeyEvent&
#include &QMessageBox&
#include &QTimer&
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
memset(_stageContent,0,sizeof(_stageContent));
//绘制舞台格子
for(int i=0;i&20;i++){
for(int j=0;j&10;j++){
temp=new QLabel(ui-&stage);
temp-&setText(&&);
temp-&setMinimumSize(QSize(15, 15));
temp-&setMaximumSize(QSize(15, 15));
temp-&setGeometry(j*16+1,i*16+1,15,15);
temp-&setStyleSheet(&border:0background-color:#FFF&);
stage[i][j]=
//绘制提示格子
for(int i=0;i&4;i++){
for(int j=0;j&4;j++){
temp=new QLabel(ui-&Tip);
temp-&setText(&&);
temp-&setMinimumSize(QSize(15, 15));
temp-&setMaximumSize(QSize(15, 15));
temp-&setGeometry(j*16+1,i*16+1,15,15);
temp-&setStyleSheet(&border:0background-color:#FFF&);
tipBox[i][j]=
//随机数种子
qsrand(QDateTime::currentDateTime().toTime_t());
timer=new QTimer();
connect(timer,SIGNAL(timeout()),this,SLOT(gameEvent()));
MainWindow::~MainWindow()
//随机图形
void MainWindow::randomShape(){
nextShape=qrand()%7;
nextPos=qrand()%4;
for(int i=0;i&4;i++){
for(int j=0;j&4;j++){
if(_shapes[nextShape][nextPos][i][j]){
tipBox[i][j]-&setStyleSheet(&border:0background-color:#5709A7&);
tipBox[i][j]-&setStyleSheet(&border:0background-color:#FFF&);
void MainWindow::addShape(){
currentShape=nextS
currentPos=nextP
for(int i=0;i&4;i++){
for(int j=0;j&4;j++){
_stageContent[i][3+j]+=_shapes[currentShape][currentPos][i][j];
void MainWindow::gameEvent(){
//如果可以下降,就下降
if(downOK()){
dropShape();
//否则计算分数消除可以消除的
calculateScore();
//如果可以添加,说明游戏未结束
if(addOK()){
addShape();
randomShape();
//否则游戏结束
timer-&stop();
QMessageBox::information(this,&Game Over&,&房顶都被你丫的顶破了~~&);
ui-&StartGame-&setEnabled(true);
ui-&StartGame-&setText(&重新开始&);
drawStage();
void MainWindow::keyPressEvent(QKeyEvent *event){
//处理键盘
switch (event-&key()){
case Qt::Key_W :
if(switchOK()) switchShape();
case Qt::Key_S :
while(downOK()) dropShape();
case Qt::Key_A :
if(leftOK()) leftShape();
case Qt::Key_D :
if(rightOK()) rightShape();
drawStage();
void MainWindow::on_StartGame_clicked(){
ui-&StartGame-&setEnabled(false);
ui-&StartGame-&setText(&正在游戏...&);
//清除舞台
memset(_stageContent,0,sizeof(_stageContent));
//置零分数
calculateScore();
//随机产生图形
randomShape();
//添加图形
addShape();
//准备下一个
randomShape();
//刷新舞台
drawStage();
//启动计时器
timer-&start(700);
在这个俄罗斯方块的例子中,我并没有对暂停做一个处理,纯粹是因为懒_(:зゝ∠)_.
俄罗斯方块源码大小:48.54KBMD5:D19F6E19A80A483EF002E1
俄罗斯方块成品大小:9.86MBMD5:912C3F6C63D28E167BF7FBAE3EF6E1EC
&手机扫描左边的二维码,立刻将文章收入手机!
&微信扫描左边二维码,点击右上角即可分享到朋友圈!
严禁任何非授权的采集与转载,转载须经站长同意并在文章显著位置标注本文连接,站长保留追究法律责任的权利.天刀内置QT的小白使用方法 熟练大神慎入_天刀攻略_17173天涯明月刀游戏专区
常用入口:
职业专栏:
基本资料:
> 天刀内置QT的小白使用方法 熟练大神慎入
天刀内置QT的小白使用方法 熟练大神慎入
天刀内置QT的小白使用方法 熟练大神慎入
你还在打野时不能和队友聊天而烦恼吗?你还在指挥队伍都快团灭时不能开黑而跳脚吼出一句KAO吗?你还在因为闲暇时与最好的哥们聊天却不想开某语音软件,或者对方电脑中没有某语音软件而纠结吗?某Y终归是外设,也占用着电脑有限的CUP和内存,不想在开游戏的时候开那么多的软件占用电脑资源,只想清清静静的玩个游戏,打个字,聊个天,调侃几句队友,求个师收个徒,那么不如来看下天刀的内设语音工具——QT。QT全称QQ Talk,是一款TX内部自研的软件,从几年前小范围在几个TX游戏中试运行,到现在所有的TX游戏中都插入这么一款自带自研的语音聊天软件,发展迅速,成为TX游戏的特色之一。对于这么一款语音聊天软件,你又了解多少呢?现在开启新手教学模式,熟练的大神免入。QT有客户端版本和内置强插两个版本,客户端版本就不在此介绍了,既然能开QT客户端那么大多数都会去开某Y,所以客户端的QT直接不说了,想尝试的大侠们请移步百度——QT官方版(小编多嘴一句,外面流氓软件太多,安装程序请一定要在官方网站安装正版)。目前TX大多数游戏都内置了QT功能,我们天刀也是。目前天刀中的内置QT是一个条形,分别以头图【QT】、显示框、音量显示、话筒显示以及目前没啥用的功能设置组成。显示框:单人模式时显示为【静音 按Ctrl+Q切换】,开启组队模式后则变更为【组队语音 按Ctrl+Q切换】音量显示:队友有语音发来时显示为高亮绿色话筒显示:自身话筒开启,有语音发出时显示为高亮绿色齿轮:目前没发现有什么用,怎么都点不开╮(╯▽╰)╭PS:在开启组队模式后,QT后端显示 按住F2发言 (目前不可以变更发言键,如果不想发言时误按到什么键,只能暂时将左边条快键键F2空着,这点期待后续官方优化)QT移动及静音:不用QT嫌弃它占用屏幕时,可以点击QT的任何一个部位将它拖到不常见的角落就可以了,需要使用时再点击QT的任何一个部位将他移动到游戏屏幕的任何地方。静音功能:如果只想安安静静的当一个美男子、美少女,不想被打扰,不想被莫名其妙的声音吓一跳,不想听队友的电流麦,特别是午夜党不想体验午夜凶音的,可以在组队后可以使用Ctrl+Q将其变为静音功能。其实QT这个功能还是比较方便简洁的,对于在游戏里勾搭徒弟\师傅,组队随便呱唧呱唧等等还是很有用处的,最近看到很多玩家在抱怨QT的糙设计及卡帧等等,小编抱着头默默说一句:既然QT内置TX所有游戏已经是既定的事实了无法改变,不如一边享用它便捷的功能,一边持续要求TX优化QT解决卡帧、更换发言键等等功能(电流党请开启自主优化模式更换耳麦),而一味的忽视,求卸载,不好用,只会让官方慢慢忽略这个功能,不能很好的重视,不能组织程序猿去优化,去改进,对我们的游戏又有何益处呢?
手机看攻略,电脑玩游戏两不误!
加点再也不需要切来切去啦~
【天涯明月刀】最新消息第一时间推送给你
与相关的文章有:求大神解释一下,为什么我游戏没有QT?【lol吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:11,833,647贴子:
求大神解释一下,为什么我游戏没有QT?
朋友在家里上号,还是在我家上 都有内置QT,唯独换成我的QQ号就没有了
腾讯游戏TGA官方解说招募开启,与娃娃,米勒,白鲨等大咖同台解说,圆你电竞梦想TGA STAR,官方解说,娃娃,米勒,白鲨,LPL,KPL,CFPL,招募报名
子:"爸,我的这篇稿子往哪里投?" 父:"往钱多的地方投。" 子:"中国人民银行,行吗?"重点是本人的签名!!!
贴吧热议榜
使用签名档&&
保存至快速回贴在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
这是我在网上找的一段代码,放在vs2017里面没问题。大多数是头文件在qt里面不能用,有的关键字在qt里面也不能用,会报错和警告,qt不是可以在window下面编程的嘛,遇到这种问题该怎么解决
#include &iostream&
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char *argv[])
const int BUF_SIZE = 64;
WSADATA//WSADATA变量
SOCKET sS//服务端套接字
SOCKET sC//客户端套接字
SOCKADDR_IN addrS//服务器地址
char buf[BUF_SIZE];//接受数据缓冲区
char sendBuf[BUF_SIZE];//返回给客户端的数据
int retV//返回值
//初始化套接字动态库
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
cout && "WSAStartup failed!" &&
//创建套接字
sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
cout && "socket failed!" &&
WSACleanup();//释放套接字资源
return -1;
//服务器套接字地址
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(6666);
addrServ.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
retVal = bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == retVal)
cout && "bind failed!" &&
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源
return -1;
//开始监听
retVal = listen(sServer,1);
if(SOCKET_ERROR == retVal)
cout && "listen failed!" &&
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源
return -1;
//接受客户端请求
sockaddr_in addrC
int addrClientlen = sizeof(addrClient);
sClient = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen);
if(INVALID_SOCKET == sClient)
cout && "accept failed!" &&
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源
return -1;
while(true)
//接受客户端数据
ZeroMemory(buf,BUF_SIZE);
retVal = recv(sClient,buf,BUF_SIZE,0);
if(SOCKET_ERROR == retVal)
cout && "recv failed!" &&
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源
return -1;
if(buf[0] == '0')
cout && "客户端发送的数据:" && buf &&
cout && "向客户端发送数据:";
cin && sendB
send(sClient,sendBuf,strlen(sendBuf),0);
closesocket(sServer);//关闭套接字
closesocket(sClient);//关闭套接字
WSACleanup();//释放套接字资源
错误 提示:C:UsersAdministrationDocumentsQtservermain.cpp:4: warning: ignoring #pragma comment
[-Wunknown-pragmas] #pragma comment(lib,"ws2_32.lib")C:UsersAdministrationDocumentsQtservermain.cpp:18: error: undefined reference to `_imp__WSAStartup@8'C:UsersAdministrationDocumentsQtservermain.cpp:24: error: undefined reference to `_imp__socket@12'C:UsersAdministrationDocumentsQtservermain.cpp:28: error: undefined reference to `_imp__WSACleanup@0'C:UsersAdministrationDocumentsQtservermain.cpp:33: error: undefined reference to `_imp__htons@4'C:UsersAdministrationDocumentsQtservermain.cpp:36: error: undefined reference to `_imp__bind@12'C:UsersAdministrationDocumentsQtservermain.cpp:40: error: undefined reference to `_imp__closesocket@4'C:UsersAdministrationDocumentsQtservermain.cpp:41: error: undefined reference to `_imp__WSACleanup@0'C:UsersAdministrationDocumentsQtservermain.cpp:45: error: undefined reference to `_imp__listen@8'C:UsersAdministrationDocumentsQtservermain.cpp:49: error: undefined reference to `_imp__closesocket@4'C:UsersAdministrationDocumentsQtservermain.cpp:50: error: undefined reference to `_imp__WSACleanup@0'C:UsersAdministrationDocumentsQtservermain.cpp:56: error: undefined reference to `_imp__accept@12'C:UsersAdministrationDocumentsQtservermain.cpp:60: error: undefined reference to `_imp__closesocket@4'C:UsersAdministrationDocumentsQtservermain.cpp:61: error: undefined reference to `_imp__WSACleanup@0'C:UsersAdministrationDocumentsQtservermain.cpp:68: error: undefined reference to `_imp__recv@16'C:UsersAdministrationDocumentsQtservermain.cpp:72: error: undefined reference to `_imp__closesocket@4'C:UsersAdministrationDocumentsQtservermain.cpp:73: error: undefined reference to `_imp__WSACleanup@0'C:UsersAdministrationDocumentsQtservermain.cpp:83: error: undefined reference to `_imp__send@16'C:UsersAdministrationDocumentsQtservermain.cpp:86: error: undefined reference to `_imp__closesocket@4'C:UsersAdministrationDocumentsQtservermain.cpp:87: error: undefined reference to `_imp__closesocket@4'C:UsersAdministrationDocumentsQtservermain.cpp:88: error: undefined reference to `_imp__WSACleanup@0'collect2.exe:-1: error: error: ld returned 1 exit status有头文件的错误,也有关键词的错误
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
winsock?不是给出了警告么?warning: ignoring #pragma comment [-Wunknown-pragmas]链接问题.你的qt的编译器配置的什么? mscv?
如果选的是msvc 可以试试在.pro
win32:LIBS += xxx.lib
win32:QMAKE_POST_LINK += xxx.dll
PS: qt有网络库的,可以通过qt +=network使用qt的网络库.
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 俄罗斯老太交视频 的文章

 

随机推荐