Qt 開發需要知道的幾個常用的語法(讀書學習筆記)

  1. 程序的打包發佈
    利用Qt Creator自帶的windeployqt 工具,是非常的方便的,
    只要新建一個testname,將release版本的可執行文件xxx.exe放到這個新建文件夾testname中,
    然後打開在開始菜單—>Qt 5.3—>MinGW 4.8 (32-bit)—>Qt 5.3 for Desktop (MinGW 4.8 32 bit)的命令窗口:

  2. 進入到 d:/qt_release
    在命令窗口中輸入:windeployqt xxx.exe,回車。
    即可將所有需要的dll動態庫文件拷貝到testname文件夾中,一下子就ok了。
    輸入命令:
    d:
    cd qt_release

calculator.exe

3.安裝軟件 Nullsoft Install System 並運行軟件

Nullsoft Install System -> HW VNISEdit -> 文件 ->新建腳本嚮導

  1. QWidget的構造函數理解
    QWidget::QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
    功能: 這個函數是QWidget的構造函數
    參數:
    parent : 指向本類對象的指針
    parent = Q_NULLPTR , 這個宏值爲 0

窗體的類型:
Qt::WindowFlags f = Qt::WindowFlags()
Qt::Widget: This is the default type for QWidget.
Qt::Window : 也是一種顯示的窗體
Qt::Dialog : 這個是對話框
Qt::SplashScreen : 沒有邊框的窗體,類似全屏的顯示

new QWidget(0,Qt::Dialog ); 對話窗體有邊框
new QWidget(0,Qt::Dialog|Qt::FramelessWindowHint ); 對話窗體沒有邊框
new QWidget(0,Qt::SplashScreen);歡迎屏幕
new QWidget(0,Qt::SplashScreen|Qt::WindowStaysOnTopHint);歡迎屏幕 保持屏幕在最頂端

  1. 窗體的位置

關於屏幕座標的認定,是按照左上角做爲起始點
0-----------------> x方向 逐步增加的
|
|
|
|
|

Y方向

帶邊框的一套函數 :x(), y(),

不帶邊框的一套函數:
geometry : 幾何結構
qDebug()<<“外框寬度:”<frameGeometry().width();
qDebug()<<“外框高度:”<frameGeometry().height();
qDebug()<<“內框寬度: “<geometry().width();
qDebug()<<“內框寬度: “<geometry().height();
w->geometry().getRect(&x,&y,&ww,&h);
qDebug()<<“外框信息: “<<”(”<<x<<”,”<<y<<”,”<<ww<<","<<h<<")";
w->frameGeometry().getRect(&x,&y,&ww,&h);
qDebug()<<“內框信息: “<<”(”<<x<<","<<y<<","<<ww<<","<<h<<")";
w->setGeometry(100,100,500,500);
w->geometry().getRect(&x,&y,&ww,&h);
qDebug()<<“外框信息: “<<”(”<<x<<","<<y<<","<<ww<<","<<h<<")";
w->frameGeometry().getRect(&x,&y,&ww,&h);
qDebug()<<“內框信息: “<<”(”<<x<<","<<y<<","<<ww<<","<<h<<")";

所有的功能都不包含標題欄

  1. qDebug(),用來向屏幕輸出字符

  2. Qdialog 這個是對話框類

這個類有被很多子類繼承
QColorDialog : 顏色對話框
QErrorMessage : 錯誤提示對話框
QFileDialog : 文件對話框
QFontDialog : 字體對話框
QInputDialog : 輸入對話框
QMessageBox : 消息提示對話框
QProgressDialog : 進度條對話框

  1. qt 工程組成原理
    (1). app w; 創建一個類對象, app的定義如下:

class app : public QWidget
{
Q_OBJECT

public:
explicit app(QWidget *parent = 0); // 構造函數
~app();

private:
Ui::app *ui; // ui 是Ui::app的類指針
};
2. Ui::app這個類的定義在哪裏
namespace Ui {
class app;
}
這個地方是類的聲明
有由app.ui這個文件 是有xml語言實現的, 這個文件由系統的一個工具, 把xml語言轉換成一個頭文件
qt_18071\day1\build-dialog-Desktop_Qt_5_6_1_MinGW_32bit-Debug\ui_app.h
3. 在app.c 中包含了這個頭文件 ui_app.h

class Ui_app
{
public:

void setupUi(QWidget *app)
{
    if (app->objectName().isEmpty())
        app->setObjectName(QStringLiteral("app"));
    app->resize(600, 400);
    app->setMinimumSize(QSize(600, 400));
    app->setMaximumSize(QSize(600, 400));

    retranslateUi(app);

    QMetaObject::connectSlotsByName(app);
} // setupUi

void retranslateUi(QWidget *app)
{
    app->setWindowTitle(QApplication::translate("app", "app", 0));
} // retranslateUi

};

namespace Ui {
class app: public Ui_app
{
};
} // namespace Ui

  1. app的構造函數實現:

  2. 設置一個對象的名稱可以使用

void setObjectName(const QString &name)

button_color_dialog->setObjectName(QStringLiteral(“button_color_dialog”));

  1. 修改應用程序的標題
    setWindowTitle 設個函數的功能是設置 應用程序的名稱

    也可以使用圖形化界面設置的方式進行設置:
    app.ui 文件中, qwidget 中找到 windowstitle 這個選項, 之後寫入應用程序的名稱即可

  2. 設置信號的發送與接收,把兩者進行捆綁
    類似linux 的信號與信號處理函數
    第一種: connect , 這個函數是屬於 QObject::connect()的靜態方法

QMetaObject::Connection connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method,
Qt::ConnectionType type = Qt::AutoConnection)

  1. 獲取顏色的對話框 QColorDialog
    QColorDialog::getColor(Qt::black,this).getRgb(&r,&g,&b);
    qDebug()<<“r:”<<r;
    qDebug()<<“g:”<<g;
    qDebug()<<“b:”<<b;

  2. QErrorMessage 錯誤提示對話框
    QString str = “應用程序核心錯誤”;
    QErrorMessage *errorp =new QErrorMessage();
    errorp->resize(300,100);
    errorp->showMessage(str);

  3. QFontDialog 字體選擇對話框
    The QFontDialog class provides a dialog widget for selecting a font.
    If the user clicks OK, the selected font is returned. If the user clicks Cancel, the initial font is returned.

    bool ok;
    QFont font = QFontDialog::getFont(&ok, QFont(“Helvetica [Cronyx]”, 10), this);
    if(ok)
    {
    qDebug()<<“點擊了OK,選擇了字體,字體爲:”<<font;

    }
    else
    {
    qDebug()<<“點擊了Canceled,沒有選擇字體,使用默認字體”;

    }
    程序輸出:
    點擊了OK,選擇了字體,字體爲: QFont( “微軟雅黑,12,-1,5,50,0,0,0,0,0” )

QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false)

 bool ok;
 QFont font = QFontDialog::getFont(&ok, QFont("Helvetica [Cronyx]", 10), this);
 if(ok)
 {
    qDebug()<<"點擊了OK,選擇了字體,字體爲:"<<font;
    qDebug()<<"字體爲  :"<<font.family();
    qDebug()<<"字體大小 :"<<font.pointSize();
    if(font.style())   // 用來獲取字體的類型
    {
        qDebug()<<"斜體";
    }
    else{
        qDebug()<<"普通字體";
    }
    if( font.bold() )  // 用來獲取字體的類型
    {
         qDebug()<<"粗體";
    }else {
         qDebug()<<"普通字體";
    }	
  1. 文件對話框 QFileDialog

fileName = QFileDialog::getOpenFileName(this,
tr(“Open Image”), “/home/jana”, tr(“Image Files (*.png *.jpg *.bmp)”));

QString getOpenFileName(QWidget *parent = Q_NULLPTR, const QString &caption = QString(),
const QString &dir = QString(), const QString &filter = QString(),
QString *selectedFilter = Q_NULLPTR, Options options = Options())

caption : 左上角顯示的文字
dir : 默認要打開的目錄
filter : 要打開什麼類型的文件

例如:
QString fileName = QFileDialog::getOpenFileName(this, tr(“Open File”),
tr(“C:/Users/ShengLi-IBM/Documents”),
tr(“txt (*.txt *.c *.jpg .)”));

qDebug()<<“文件名:”<< fileName;

顯示:
文件名: “E:/ShengLi/01-Teaching/講課筆記/18071/01-c_base/1基礎知識.pdf”

  1. QMessageBox 消息提示對話框

Static functions are available for creating information(), question(), warning(), and critical() message boxes.

int ret = QMessageBox::warning(this, tr(“My Application”),
tr(“The document has been modified.\n”
“Do you want to save your changes?”),
QMessageBox::Save | QMessageBox::Discard
| QMessageBox::Cancel,
QMessageBox::Save);

  1. QProgressDialog : 進度條對話框
    構造函數:
    QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())

QProgressDialog progress(“Copying files…”, “Abort Copy”, 0, numFiles, this);
progress.setWindowModality(Qt::WindowModal);

  for (int i = 0; i < numFiles; i++) {
      progress.setValue(i);

      if (progress.wasCanceled())
          break;
      //... copy one file
  }
  progress.setValue(numFiles);
  1. 給一個窗體設置一個圖片

在qt中一個系統的圖標文件使用一個QIcon 去表示

構造函數:
QIcon(const QString &fileName)
fileName: 要打開的文件名

設置圖標的第一種方式:
(1)右擊工程->添加新文件 ->Qt -> Qt resource file -> 下一步 -> 填入資源名稱
(2)右擊新建的資源文件-> 添加現有文件-> 找到文件打開
(3)打開ui文件,找到QWidget->Windows Icon ->normal on -> 單機右邊空白部分,-> 點擊… -> 選擇圖片即可

設置圖標的第二種方法:直接使用setWindowIcon
this->setWindowIcon(QIcon(":/icons/png-0007.png"));

19.QLineEdit 用於一行文本的輸入和顯示
(1)可以通過setText() or insert() 來改變文本的內容
(2)獲取裏面的內容 使用: text()
(3)當裏面的文本發生改變時, 有一個信號被髮送 textChanged()
(4)當裏面的文本中光標移動時, 也會發送給一個信號 cursorPositionChanged()
(5)行光標選中這個輸入框時, returnPressed() 信號被髮送
(6)當輸入完成時,光標移出輸入框時, editingFinished() 信號被髮送
(7)可以設置顯示模式,setEchoMode(EchoMode)

QLineEdit::Normal 0 Display characters as they are entered. This is the default.
QLineEdit::NoEcho 1 Do not display anything. This may be appropriate for passwords where even the length of the password should be kept secret.
QLineEdit::Password 2 Display platform-dependent password mask characters instead of the characters actually entered.
QLineEdit::PasswordEchoOnEdit 3 Display characters as they are entered while editing otherwise display characters as with Password.

  1. QDateTimeEdit 用來獲取和設置日期和時間
    (1) 獲取日期 date() , 設置日期setDate()
    (2)Qt QDateEdit 設置下拉日曆:
    通過成員函數setCalendarPopup(bool)設置一下屬性,就可以使其以日曆的方式顯示
    QDateEdit date = new QDateEdit();
    date->setCalendarPopup(true);

  2. QPlainTextEdit 沒有格式的文本輸入與顯示
    (1)設置顯示內容: setPlainText()
    (2)插入文本 insertPlainText(),appendPlainText() or paste().
    (3)獲取文本 toplainText()
    (4) 文本發生改變時。會發送一個信號 textChanged()

在進行編程時,我們經常需要用到字符串這種類型,毫無疑問,Qt 庫中也對字符串類型進行了封裝,QString 類提供了你能想到的所有字符串操作方法,給開發者帶來了極大方便。
  但是我們在編寫程序時,不可避免地會在 Qt 框架上使用第三方的開源庫,由於庫的類型基本上都是標準的類型,即使用 char * 來表示字符串類型。那麼問題來了,QString 和 char * 之間如何進行轉換呢?

下面分兩種情況進行說明。

一、QString 轉換爲 char *

將 QString 轉 char *,需要用到 QByteArray 類,QByteArray 類的說明詳見 Qt 幫助文檔。
  因爲 char * 最後都有一個’\0’作爲結束符,而採用 QString::toLatin1()// 不支持中文
QString::toUtf8()
時會在字符串後面加上’\0’。

方法如下:

QString str;
char* ch;
QByteArray ba = str.toUtf8(); // must
ch=ba.data();

  1. 打印文本 QPrinter 和 QPrintDialog

    QPrinter printer;
    QPrintDialog printDialog(&printer,this);
    if (printDialog.exec() == QDialog::Accepted)
    {
    ui->plainTextEdit->print(&printer);
    }

  2. 幫助提示, 和關於qt

void about(QWidget *parent, const QString &title, const QString &text) // 軟件的幫助信息

void aboutQt(QWidget *parent, const QString &title = QString()) // 關於qt的表述

  1. 給應用程序一個圖片
    在成功的.pro文件中,加入一句話:
    RC_ICONS +=icons/logo1.ico // 圖片路徑

因爲圖片存在 icons/logo1

  1. 在使用在使用nsis發佈軟件時 如果快捷方式沒有圖片的解決辦法:
    在使用nsis發佈軟件時 讓快捷方式也有圖標的實現方式
    修改腳本中的 :CreateShortCut “KaTeX parse error: Expected 'EOF', got '\notepad' at position 8: DESKTOP\̲n̲o̲t̲e̲p̲a̲d̲.lnk" "INSTDIR\note.exe”
    改爲:
    CreateShortCut “KaTeX parse error: Expected 'EOF', got '\notepad' at position 8: DESKTOP\̲n̲o̲t̲e̲p̲a̲d̲.lnk" "INSTDIR\note.exe” $INSTDIR/logo1.ico

  2. qt中處理圖片的類有 QImage, QPixmap, QBitmap and QPicture

QImageReader QImageWriter QPixmap QImage

Warning: “No decoder available for type ‘audio/mpeg, mpegversion=(int)1, mpegaudioversion=(int)1, layer=(int)3, rate=(int)44100, channels=(int)2,parsed=(boolean)true’.”
Error: “Your GStreamer installation is missing a plug-in.”

sudo add-apt-repository ppa:mc3man/gstffmpeg-keep
sudo apt-get update
sudo apt-get install gstreamer0.10-ffmpeg
sudo apt-get install gstreamer0.10-plugins-ugly

或則 :

sudo apt-get install gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav

  1. qt 操作sqlite3的數據庫 QSqlDatabase
    QT += sql

qDebug()<<QSqlDatabase::drivers();可以查看默認支持的數據庫

QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);創建一個sqllite3數據庫
db.setDatabaseName(“E:/ShengLi/examples/qt_16110/04-day/sqlite3/my.db”); // 指定要打開的數據庫名稱
if(!db.open())
{
QMessageBox::critical(this,tr(“打開數據庫失敗”),tr(“打開my.db 錯誤”) );
}

30 . 執行一條sql語句 QSqlQuery
QSqlQuery query;
query.prepare(“create table user(id text primary key,passwd text,name text);”);
if (! query.exec())
{
QMessageBox::warning(NULL, “my.db”,
tr(“create table error”));
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章