C++ Develop 11 --- 2020.9.2

记录开发



12. 文件

1. 实现功能

点击文件选取按钮,实现文件的选择及打印;

在这里插入图片描述

用 Lambda 表达式来实现按钮的连接,不是太难

 connect(ui->pushButton,&QPushButton::clicked,[=](){

        QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\zhangtao\\Desktop");    
        //记住路径要用双斜线或者反斜线;
}:

但打开时什么也不会显示,现在需要将路径显示在上方框中,则将 Open 的值返回到一个 QString 对象中;

connect(ui->pushButton,&QPushButton::clicked,[=](){

        QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\zhangtao\\Desktop");    
        //记住路径要用双斜线或者反斜线;
        //将路径放入到lineEdit中
        ui->lineEdit->setText(path);
};

接下来读取文件并显示在下方大文本框中:

//读取内容 放入到 textEdit中
// QFile默认支持的格式是 utf-8
QFile file(path); //参数就是读取文件的路径
//设置打开方式
file.open(QIODevice::ReadOnly);

然后放入文本框:

QByteArray array = file.readAll();

//将读取到的数据 放入textEdit中
ui->textEdit->setText(array);	//这才是放入操作;
//ui->textEdit->setText( codec->toUnicode(array)  );
//默认支持的格式为 UTF-8 
//对文件对象进行关闭
file.close();

文件打开的默认格式为 UTF-8,格式的更改需要用到 QTextCodeC 类;

//编码格式类
QTextCodec * codec = QTextCodec::codecForName("gbk");
ui->textEdit->setText(codec->toUnicode(array));	//用 codec 做一个类型转换;

按行读文件:

QByteArray array;
while( !file.atEnd())
{
    array += file.readLine(); //按行读
}

以追加的方式写入文件

//进行写文件
file.open(QIODevice::Append); //用追加方式进行写
file.write("啊啊啊啊啊");

2. 读取文件信息

文件信息存储的类为 QFileInfo,查看帮助文档可知,其含有较丰富的函数库,常用的有后缀名,创建日期,作者,文件名,文件路径等;

在这里插入图片描述

读取方法

QFileInfo info(path);

qDebug() << "大小:" << info.size() << " 后缀名:" << info.suffix() << " 文件名称:"<<info.fileName() << " 文件路径:"<< info.filePath();
qDebug() << "创建日期:" << info.created().toString("yyyy/MM/dd hh:mm:ss");		//返回的是 QDateTime 类型,且可以格式化;
qDebug() << "最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");

在这里插入图片描述

13. 翻硬币小游戏

1. 菜单栏以及背景图

    //设置窗口大小;
    setFixedSize(320, 588);

    //设置图标;
    setWindowIcon(QIcon(":/res/Coin0001.png"));

    //设置标题;
    setWindowTitle("CoinFlip");

    //退出操作;
    connect(ui->quit, &QAction::triggered, [=](){
        this->close();
    });

void MainScene::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/res/PlayLevelSceneBg.png");
    painter.drawPixmap(0, 0, this->width(), this->height(), pix);      // 平铺拉伸;
    pix.load(":/res/Title.png");
    pix = pix.scaled(pix.width() * 0.5, pix.height() * 0.5);
    painter.drawPixmap(10, 30, pix);

}

2. 创建新的按钮类

MyPushButton.h

class MyPushButton : public QPushButton
{
    Q_OBJECT
public:
    //explicit MyPushButton(QWidget *parent = nullptr);

    MyPushButton(QString normalImg, QString pressImg = "");

    QString normalImgPath;
    QString pressImgPath;

    //弹跳特效;
    void zoom_down();
    void zoom_up();
signals:

};

MyPushButton.cpp

MyPushButton::MyPushButton(QString normalImg, QString pressImg)     //若声明里有默认值,则定义里不需要,反之亦然;
{
    this->normalImgPath = normalImg;
    this->pressImgPath = pressImg;

    QPixmap pix;
    bool ret = pix.load(normalImg);
    if(!ret) {
        qDebug() << "Error";
        return;
    }


    this->setFixedSize(pix.width(), pix.height());

    this->setStyleSheet("QPushButton{border:0px}"); //边框为 0 像素;

    this->setIcon(pix);

    this->setIconSize(QSize(pix.width(), pix.height()));

}

void MyPushButton::zoom_down()  //向下弹跳动画;
{
    QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry");
    animation->setDuration(200);
    animation->setStartValue(QRect(this->x(), this->y(), this->width(), this->height()));
    animation->setEndValue(QRect(this->x(), this->y() + 10, this->width(), this->height()));
    animation->setEasingCurve(QEasingCurve::OutCurve);
    animation->start();
}

void MyPushButton::zoom_up()    //向上弹跳动画;
{
    QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry");
    animation->setDuration(200);
    animation->setStartValue(QRect(this->x(), this->y() + 10, this->width(), this->height()));
    animation->setEndValue(QRect(this->x(), this->y(), this->width(), this->height()));
    animation->setEasingCurve(QEasingCurve::OutCurve);
    animation->start();
}

明天应该就能全部看完了,可以写出自己的第一个游戏了;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用循环来计算1-2+3-4+.....-n的值,具体实现如下: 1. 定义一个变量sum,用于存储计算结果。 2. 使用循环从1到n遍历每个数字,判断当前数字的奇偶性。 3. 如果当前数字是奇数,则将其加入sum中;如果当前数字是偶数,则将其减去。 4. 循环结束后,sum中存储的即为1-2+3-4+.....-n的值。 代码实现如下: int sum = ; for (int i = 1; i <= n; i++) { if (i % 2 == 1) { sum += i; } else { sum -= i; } } return sum; 注意:上述代码中使用了取模运算符%来判断数字的奇偶性,%表示取余数,当i%2的结果为1时,表示i是奇数;当i%2的结果为时,表示i是偶数。 ### 回答2: 这道题目可以使用循环来解决。我们可以观察到,这道题目中每两个数之间都有一个符号,而第一个数永远是正数。因此,我们可以从1开始,每次增加2来得到每组的第一个数,然后减去它的下一个数。需要注意的是,最后一个数可能会有两种情况。如果n是偶数,那么最后一个数是负数,应该加回来;如果n是奇数,那么最后一个数是正数,不需要加回来。 下面是具体的代码实现: ```python def calculate(n): result = 0 for i in range(1, n, 2): result += i - (i + 1) if n % 2 == 0: result += n else: result -= n return result ``` 这个函数接受一个参数n,表示需要计算到哪一个数。首先我们初始化结果为0,然后使用for循环从1开始到n-1为止,每次增加2。在循环中,我们计算当前数i减去它的下一个数i+1,并将结果加上去。最后,根据n的奇偶性来判断最后一个数是否需要加回来或者减去。注意计算结果可能为0,因此可以在函数最后加一句判断,如果结果为0,则显示"0"。 ### 回答3: 题目要求计算1-2 3-4 ......-n的值,具体表达式可以写成1-2+3-4+......+(-1)^{n+1}*n。 这道题目可以用循环结构来解决,可以使用for循环或while循环,这里以for循环为例说明。首先,定义一个变量sum来存储最终的和,初始值为0。接下来,使用for循环遍历从1到n之间的所有整数,每遍历一个数,就根据该数的奇偶性来决定正负号,如果是奇数,就加上该数,否则就减去该数。最后,将所有数的结果相加,得到最终的和sum。 具体实现代码如下: int sum = 0; for(int i = 1;i <= n;i++){ if(i % 2 == 1){ sum += i; }else{ sum -= i; } } cout << sum; 以上代码中,使用了if-else语句来判断遍历的数是奇数还是偶数,并分别进行加减运算。最后输出sum即可,这就完成了计算1-2 3-4 ......-n的值的计算。 需要注意的是,在输入n之前需要对n进行判断,确保其为正整数。否则可能导致出现非法数据,从而影响计算结果。此外,如果n的值过大,循环的次数可能会非常多,导致算法的效率变低,因此在优化代码时,可以考虑使用其他方法,如等差数列求和公式等,来提高计算速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值