-
程序的打包發佈
利用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)的命令窗口: -
進入到 d:/qt_release
在命令窗口中輸入:windeployqt xxx.exe,回車。
即可將所有需要的dll動態庫文件拷貝到testname文件夾中,一下子就ok了。
輸入命令:
d:
cd qt_release
calculator.exe
3.安裝軟件 Nullsoft Install System 並運行軟件
Nullsoft Install System -> HW VNISEdit -> 文件 ->新建腳本嚮導
- 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);歡迎屏幕 保持屏幕在最頂端
- 窗體的位置
關於屏幕座標的認定,是按照左上角做爲起始點
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<<")";
所有的功能都不包含標題欄
-
qDebug(),用來向屏幕輸出字符
-
Qdialog 這個是對話框類
這個類有被很多子類繼承
QColorDialog : 顏色對話框
QErrorMessage : 錯誤提示對話框
QFileDialog : 文件對話框
QFontDialog : 字體對話框
QInputDialog : 輸入對話框
QMessageBox : 消息提示對話框
QProgressDialog : 進度條對話框
- 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
-
app的構造函數實現:
-
設置一個對象的名稱可以使用
void setObjectName(const QString &name)
button_color_dialog->setObjectName(QStringLiteral(“button_color_dialog”));
-
修改應用程序的標題
setWindowTitle 設個函數的功能是設置 應用程序的名稱也可以使用圖形化界面設置的方式進行設置:
app.ui 文件中, qwidget 中找到 windowstitle 這個選項, 之後寫入應用程序的名稱即可 -
設置信號的發送與接收,把兩者進行捆綁
類似linux 的信號與信號處理函數
第一種: connect , 這個函數是屬於 QObject::connect()的靜態方法
QMetaObject::Connection connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method,
Qt::ConnectionType type = Qt::AutoConnection)
-
獲取顏色的對話框 QColorDialog
QColorDialog::getColor(Qt::black,this).getRgb(&r,&g,&b);
qDebug()<<“r:”<<r;
qDebug()<<“g:”<<g;
qDebug()<<“b:”<<b; -
QErrorMessage 錯誤提示對話框
QString str = “應用程序核心錯誤”;
QErrorMessage *errorp =new QErrorMessage();
errorp->resize(300,100);
errorp->showMessage(str); -
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()<<"普通字體";
}
- 文件對話框 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”
- 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);
- 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);
- 給一個窗體設置一個圖片
在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.
-
QDateTimeEdit 用來獲取和設置日期和時間
(1) 獲取日期 date() , 設置日期setDate()
(2)Qt QDateEdit 設置下拉日曆:
通過成員函數setCalendarPopup(bool)設置一下屬性,就可以使其以日曆的方式顯示
QDateEdit date = new QDateEdit();
date->setCalendarPopup(true); -
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();
-
打印文本 QPrinter 和 QPrintDialog
QPrinter printer;
QPrintDialog printDialog(&printer,this);
if (printDialog.exec() == QDialog::Accepted)
{
ui->plainTextEdit->print(&printer);
} -
幫助提示, 和關於qt
void about(QWidget *parent, const QString &title, const QString &text) // 軟件的幫助信息
void aboutQt(QWidget *parent, const QString &title = QString()) // 關於qt的表述
- 給應用程序一個圖片
在成功的.pro文件中,加入一句話:
RC_ICONS +=icons/logo1.ico // 圖片路徑
因爲圖片存在 icons/logo1
-
在使用在使用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 -
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
- 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”));
}