0%

添加远端仓库

有时一个仓库可能有多个分支或者多个维护者版本,此时我们可能希望跟踪多个版本。

如何解决呢,就需要添加远程仓库。

可以使用一个简单的名字,以便将来引用,运行 git remote add [shortname] [url]

然后使用$ git remote -v就可以看到远端分支与对应的网址了,
此时就可以使用git fetch [shortname]或者git pull [shortname]来抓取更新了。

从远程仓库抓取数据

正如之前所说的,可以用下面的命令从远程仓库抓取数据到本地:

1
2
$ git fetch [remote-name]
$ git pull [remote-name]

那么这两个命令的区别在那里呢?

如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。

Linux下的off_t类型

off_t类型用于指示文件的偏移量,常就是long类型,其默认为一个32位的整数,在gcc编译中会被编译为long int类型,在64位的Linux系统中则会被编译为long long int,这是一个64位的整数,其定义在unistd.h头文件中可以查看。

1
2
3
4
5
6
7
8
9
10
11
12
# ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
# endif
# if defined __USE_LARGEFILE64 && !defined __off64_t_defined
typedef __off64_t off64_t;
# define __off64_t_defined
# endif

git修改远程仓库地址

有些情况下git的远程地址可能有变动,那么此时就需要修改找个repo地址。

方法有下面三种:

修改命令

git remote set-url origin [url]
例如:git remote set-url origin new-address.git

先删除再添加

git remote rm origin
git remote add origin [url]

直接修改config文件

打开当前目录的.git/config文件,修改对应的地址即可。

读写二进制文件

需要的头文件

1
2
3
4
5
#include <QMessageBox>
#include <QString>
#include <QPixmap>
#include <QFile>
#include <QDataStream>

写二进制文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool write_file(const QString &filename)
{
QFile file(filename);
if(!file.open(QIODevice::WriteOnly))
{
QMessageBox::warning(this,tr("My App"),tr("Cannot write file %1:\n%2 .").arg(file.fileName()).arg(file.errorString()));
return false;
}

QDataStream out(&file);
out.setVersion(QDataStream::Qt_5_7);

out << qint32(0x1234abcd);

QApplication::setOverrideCursor(Qt::WaitCursor);

for (int i;i<100;i++)
out << quint16(i);

QApplication::setOverrideCursor(Qt::ArrowCursor);
return true;
}

读二进制文件

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
bool read_file(const QString &filename)
{
QFile file(filename);
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::warning(this,tr("My App"),tr("Cannot read file %1:\n%2.").arg(file.fileName()).arg(file.errorString()));
return false;
}

QDataStream in(&file);
in.setVersion(QDataStream::Qt_5_7);

//in << qint32(0x1234abcd);
qint32 magic;
in >> magic;

if (magic != 0x1234abcd)
{
QMessageBox::warning(this,tr("My App"),tr("This is not a correct file"));
return false;
}

QApplication::setOverrideCursor(Qt::WaitCursor);

quint16 temp;

while (!in.atEnd()) {
in >> temp;
ui->textEdit->setText(QString("%1").arg(temp));
}

QApplication::setOverrideCursor(Qt::ArrowCursor);
return true;
}

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
#include <QApplication>
#include <QSplashScreen>
#include <QDateTime>

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

QSplashScreen *splash = new QSplashScreen;

splash->setPixmap(QPixmap(":/images/china.jpg"));
//splash->setWindowFlags(Qt::WindowStaysOnTopHint);
splash->show();

splash->showMessage("Will start in 1 seconds",Qt::AlignTop,Qt::blue);

QDateTime n=QDateTime::currentDateTime();
QDateTime now;
do{
now=QDateTime::currentDateTime();
a.processEvents();
} while (n.secsTo(now)<=2);


splash->showMessage("Started...",Qt::AlignTop,Qt::blue);

do{
now=QDateTime::currentDateTime();
a.processEvents();
} while (n.secsTo(now)<=2);

MainWindow w;
w.show();
splash->finish(&w);
delete splash;

return a.exec();
}

读写配置文件

Qt提供了一个读取配置文件的类QSetting

写配置文件

1
2
3
4
5
6
void write_setting()
{
QSettings setting("SHAO","My App");
setting.setValue("name","SHAO");
setting.setValue("code",200030);
}

读配置文件

1
2
3
4
5
6
void read_setting()
{
QSettings setting("SHAO","My App");
QString name = setting.value("name").toString();
qint32 code = setting.value("code").toInt();
}

读取配置ini文件

配置文件(.ini)格式:

1
2
3
4
5
6
number=2
[config]
node1=sucess
size=20
[source]
name=PC

读取上面的ini文件的简单代码如下所示

1
2
3
4
5
6
7
8
9
QSettings settings("test.ini",QSettings::IniFormat);

ui->label->setText(settings.value("config/node1").toString());

ui->lineEdit->setText(settings.value("config/size").toString());

int a=settings.value("number").toInt();

qDebug("the value a is: %d",a);

假设有个对话框的类Dialog,首先初始化一个对象

1
2
Dialog *dialog;
dialog = new Dialog(this);

如果使用show调用,那就是非模态对话框

1
dialog->show();

如果使用exec调用,那就是模态对话框

1
dialog->exec();

每个Widget都有一个windowModified属性,如果该窗口的文档存在没有保存的变化,则将其设置为true,否则设置为false

1
2
this->setWindowModified(true);
this->setWindowTitle(tr("%1[*] - %2").arg(filename).arg(path));

Qt 的消息框

Qt的消息框基本分为下面几种。

  • critical : 出现比较严重的问题
  • information:提示信息
  • question:问题信息
  • warning:警告信息
  • aboutQt:关于Qt的信息
  • about:主要用于自定义,在个人程序里面属于用的比较多的

critical 严重错误

源代码如下

1
2
3
4
5
6
7
8
9
10
```
int rst = QMessageBox::critical(this,tr("Test Title"),tr("This is just a test\nWhat do you want to do?"),QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
if (rst == QMessageBox::Cancel)
qDebug("Cancel");
else if (rst == QMessageBox::Yes){
return save()
}
else {
return false;
}

效果图

information 信息

源代码如下

1
2
3
4
5
6
7
8
9
10
```
int rst = QMessageBox::information(this,tr("Test Title"),tr("This is just a test\nWhat do you want to do?"),QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
if (rst == QMessageBox::Cancel)
qDebug("Cancel");
else if (rst == QMessageBox::Yes){
return save()
}
else {
return false;
}

效果图

question 提问

源代码如下

1
2
3
4
5
6
7
8
9
10
```
int rst = QMessageBox::question(this,tr("Test Title"),tr("This is just a test\nWhat do you want to do?"),QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
if (rst == QMessageBox::Cancel)
qDebug("Cancel");
else if (rst == QMessageBox::Yes){
return save()
}
else {
return false;
}

效果图

warning 警告

源代码如下

1
2
3
4
5
6
7
8
9
10
```
int rst = QMessageBox::warning(this,tr("Test Title"),tr("This is just a test\nWhat do you want to do?"),QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
if (rst == QMessageBox::Cancel)
qDebug("Cancel");
else if (rst == QMessageBox::Yes){
return save()
}
else {
return false;
}

效果图

aboutQt

源代码如下

1
QMessageBox::aboutQt(this,"Test");

效果图

about

源代码如下

1
2
```
QMessageBox::about(this,"My App","This is just a demo\nVersion 0.1 Alpha\nWill improve in the following days...");

效果图

about改进

源代码如下

1
2
3
4
5
6
```
QMessageBox::about(this,tr("About My App"),
tr("<h2> My App 0.1 Alpha</h2>"
"<p>Copyright &copy; 2014 Software Inc."
"<p>My App is a small application that "
"demonstrates blabla...."));

效果图

实现代码

1
2
3
4
5
ui->tableView->addAction(cutAction);
ui->tableView->addAction(copyAction);
ui->tableView->addAction(pasteAction);
ui->tableView->setContextMenuPolicy(Qt::ActionsContextMenu);
this->setCentralWidget(ui->tableView); //set the central widget