1. 程式人生 > >QT中的小細節

QT中的小細節

類比 容器類 string int setfile ack 大小 sign 提升


一 . QT4和QT5的區別(信號和槽):
1. QT4:
connect(button,SIGNAL(pressed()),this,SLOT(close()));
/**
* 優點 :寫法簡單
* 缺點: SIGNAL(), SLOT()是兩個宏,將函數轉換為字符串
* 編譯時不做錯誤檢查,影響程序的健壯性
*/

2. QT5
connect(button,&QPushButton::clicked,this,&Widget::close);
/**
* sender: 信號發出者
* signal: 觸發的信號(標準,自定義)
* receiver: 接受者
* slot: 處理的槽函數(標準,自定義)
*/


3. 信號與槽,信號類比於短信,槽類比於接收短信的手機


/**
* 1. 信號:普通函數(signal:),只需要聲明不需要實現
* 2. 槽函數:QT5類中的任意成員函數,靜態函數,全局函數,lambda表達式
* 3. 信號和槽可以使用QT內部定義好的,也可以自定義
* 4. 信號和槽是沒有返回值的,但是可以有參數
* 5. 信號和槽的參數列表順序必須一致
* void signal(int, double, char);
* void slot(int, double, char);
* 6. 信號和槽的參數個數可以不一樣
* 信號的參數個數可以大於槽函數參數的個數
* 槽函數個數不可以大於信號參數個數
*/


4. 信號槽的擴展
/**
* 1. 一個信號可以連接多個槽函數
* 2. 槽函數執行的順序是隨機的,不能控制
* 3. 信號可以連接信號
* 4. 信號草連接成功後,可以斷開連接disconnect()
* 5. 槽函數可以是Lambl表達式
*/

二 . 常用控件

1. 常用控件
Qt ui
ui->
ui_xxx.h

1) 按鈕類
QPushButton
QToolButoon
QRadioButton
2) item
QListWidget
3) 容器類
QStackWidget
QWidget
QFrame
4) 編輯類
QComboBox
QLineEdit
QTextEdit
5) 顯示類
QLable
QLcdNumber
QProgressBar

2) 布局
水平
垂直
網格
布局屬性
大小策略
最小大小
最大大小
容器(分類)
彈簧

3) 自定義控件(提升)
a) ui的控件和自定義控件的父類(基類)要一樣
b) 選中ui控件->提升

4) 常用事件處理
事件處理器
1) 都是虛函數(基類中定義QWiget QObiect)
2) 我們派生類(子類)只是重寫這些虛函數(虛函數必須和基類中的虛函數一致)

QString s = "";
switch(e->modifies())
{
case Qt::ControlModifier:
s = "Ctrl+";
break;
case Qt::AltModifier:
s = "Alt+";
break;
}

switch(e->key)
{
case Qt::Key_Left:
s += "left_Key Press";
break;
}

三. 繪圖

1. 在窗口中繪圖,重寫繪圖事件,虛函數
void paintEvent(QPaintEvent *event) //繪圖不一定要放在這個函數裏,但是在窗口裏面,必須放在這裏
{
QPaintEvent p(this); //創建畫家,下窗口上繪圖
p.drawXXX();

p.drawPixmap(0, 0, width(), height(), QPixmap());
p.drawPixmap(x, 0, 80, 80, QPixmap);
p.drawImage(); //QImage
p.drawPicture(); //QPicture
p.drawLine();
p.drawPixmap(); //QBitmap: 黑白: 光標
}

x += 20;
if(x > width)
{
x = 0;
}

update(); //間接調用paintEvent()


2. QBitmap -> QPixmap

QBitmap 黑白色
QPixmap 彩色的

3. 繪圖設備
QPixmap: 針對屏幕進行了優化,和平臺相關,不能對圖片進行修改(保存內容為圖片)
QImage : 和平臺無關,可以對圖片進行修改,在線程中繪圖(保存內容為圖片)
QPicture : 保存繪圖的狀態(二進制文件) //QImage 和QPicture的操作是一樣的

4. QPixmap -> QImage
QPixmap a;
a.toImage();

5. QImage -> QPixmap
QImage b;
QPixmap::fromImag(b);

6. 例子

QPainter p;
QPicture pic;
p.begin(&pic);//指定繪圖設備
//繪圖動作
p.end();
pic.save("demo.aa");


QPicture temp;
temp.load("demo.aa");

7. 不規則窗口
1) 給窗口畫一張背景圖
2) 去邊框
3) 設定屬性(背景透明)
4) 移動坐標是相對屏幕而言

四. 文件操作

1. 基本操作

QFile file;
file.setFileName();
file.open();
file.write();
file.read();
file.close();


QFileInfo info;
info.size();
info.fileName();

QDataStream: //通過二進制的方法操作
QTxetStream: //通過文本方式操作(指定編碼)
QBuffer: //內存文件

2. 文件讀操作

void Widget::on_Button_read_clicked()
{
QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)");

if(path.isEmpty() == false)
{
//文件對象
QFile file(path);

//打開文件: 只讀的方式
bool isOK = file.open(QIODevice::ReadOnly);
if(isOK == true)
{
#if 0
//讀文件: 默認只識別utf8編碼
QByteArray array = file.readAll();

//顯示到編輯區
ui->textEdit->setText(QString(array));
#endif


QByteArray array;
while(file.atEnd() == false)
{
//讀一行
array += file.readLine();
}
ui->textEdit->setText(array);
}

//關閉文件
file.close();


}
}

3. 文件寫操作

void Widget::on_Button_write_clicked()
{
QString path = QFileDialog::getSaveFileName(this, "save", "../", "TXT(*.txt)");
if(path.isEmpty() == false)
{
QFile file;//創建文件對象
file.setFileName(path);

//打開方式: 只寫方式
bool isOK = file.open(QIODevice::WriteOnly);
if(isOK == true)
{
//獲取編輯區內容
QString str = ui->textEdit->toPlainText();


/**
寫文件
*/

//第一種
//QString -> QByteArray
file.write(str.toUtf8());

// //第二種
// //QString -> c++ string -> char*
// file.write(str.toStdString().data());

// //轉換為本地平臺編碼
// file.write(str.toLocal8Bit());

// //第三種
// //QString -> QByteArray
// QString buf = "123";
// QByteArray a = buf.toUtf8();//中文
// a = buf.toLocal8Bit();//本地編碼

// //QByteArray -> char *
// char *b = a.data();

// //網絡轉換
// char *p = "abc";
// QString c = QString(p);

}

//關閉文件
file.close();
}
}

tips:

設置整個文件的編碼格式為utf-8
#pragma execution_character_set("utf-8")

QT中的小細節