嗯。。。這次接了個單
要求圖形界面,剛好可以鞏固並學習下QT。毫不猶豫的就接了
下面記錄下出現的問題:
QDialog下的槽函數有accept()與reject()可以直接用
並且QDialog有exec() 這種方式顯示窗口,是阻塞形的
而QWidget則只有show()要自己寫阻塞
介個方法很多啦
我用的是直接傳值給子窗口裡的變量:
比如說:
子窗口有:
class changemsg : public QDialog { Q_OBJECT public: changemsg(QWidget *parent = 0); ~changemsg(); person *pn = nullptr; void setMsg(); private: Ui::changemsg ui; public slots: void rev_change(); };
主窗口有:
void addressbookqt5vesion::rev_btn_change() { int i = getObjFromtableSelected(); if (i != -1) { changemsg* chmsh = new changemsg(this); chmsh->pn = &vt_pn[getObjFromtableSelected()]; chmsh->setMsg(); chmsh->exec(); } }
在exec前先將參數傳入即可
子窗口給主窗口傳遞可以用信號槽解決
不過在這裡因為我使用的還是直接調用子窗口的變量…
class addmsg : public QDialog { Q_OBJECT public: addmsg(QDialog *parent = 0); ~addmsg(); person *pn = nullptr; person getPerson() { return *pn; } private: Ui::addmsg ui; public slots: void rev_addp(); };
可以在主窗口的槽函數裡寫如下:
void addressbookqt5vesion::rev_btn_add() { addmsg add; if (add.exec() == QDialog::Accepted) { if (add.pn != nullptr) { vt_pn.push_back(*add.pn); } else { QMessageBox::warning(this, tr("Add"), tr("Please enter a name!.")); } }
直接通過指針pn來修改刪除
其中之一構造函數:
QDataStream ( QIODevice * d )
QIODevice描述了一個可以從中讀數據和向它寫數據的輸入/輸出介質。QFile類就是一個IO設備的例子。
先上一段打開文件的代碼:
無用部分已刪除
void addressbookqt5vesion::rev_openfile() { QString path = QFileDialog::getOpenFileName(this, tr("open file"), ".", tr("Text Files(*.dat)")); if (!path.isEmpty()) { QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(path)); return; } //流讀取文件 QDataStream ins(&file); person pn; while (!ins.atEnd()) { ins >> pn.pid >> pn.name >> pn.ismale >> pn.type >> pn.date >> pn.phone >> pn.email; char *ch = new char(MAXPERSONSIZE + 1); ins >> ch; person::recoverboolarr(ch); delete(ch); vt_pn.push_back(pn); } ishavecreatenewfile = true; havecreatefilepath = path; //允許保存 ui.actionSave->setEnabled(true); ui.actionSaveAs->setEnabled(true); file.close(); } else { QMessageBox::warning(this, tr("Path"), tr("You did not select any file.")); } }
關鍵代碼:
ins >> pn.pid >> pn.name >> pn.ismale >> pn.type >> pn.date >> pn.phone >> pn.email; char *ch = new char(MAXPERSONSIZE + 1); ins >> ch;
從這三行中我們可以知道:
1、QDataStream 可以使用>> 和 << 流操作
2、寫入文件的數據類型可以得到保留
3、允許多種類型的數據,這裡有:QString、int、bool、char *
(鑒於沒有bool *的…故而我先將bool[] 轉換為char *數組(以’0’,’1’為標志) 寫入。讀取時再轉換回去即可)
4、由於有數據類型的存儲,故而存儲文件無法用txt打開
QDataStream 的 寫入同理可知,不再贅述。
如圖:
可以在QT設計器界面中找到:
點擊新建
然後重要的一部。。將動作編輯器的一個條目拖動到窗口動作條上。。。
(這一步我研究了好久才發現。。。原來可以拖!!!!!)
然後給主窗口添加幾個槽
在信號槽編輯器將動作鏈接上槽即可
點擊信號一般是triggred()
如圖 :
1.在項目文件夾裡創建名為*.rc的文件,如myapp.rc。
2.文件中寫入IDI_ICON1 ICON DISCARDABLE "myapp.ico" 其中,myapp.ico為圖標的文件名。
3.將文件myapp.ico拷貝到項目文件夾內。
4.在解決方案資源管理器中,右鍵點擊項目,添加myapp.rc及myapp.ico。
5.重新生成解決方案。
1. 添加qt的bin/目錄進系統path變量。很簡單,在系統屬性裡設置,添加C:\Qt\Qt5.4.0\5.4\msvc2013_64\bin; 到系統path環境變量
2. 在任意目錄新建文件夾,把編譯完成後的qt exe可執行程序拷貝過去。
從命令行模式進入該文件夾,執行語句windeployqt xxxx.exe
之後該工具會分析程序依賴性,自動添加必要dll文件至該目錄。
3. 使用NSIS等打包軟件進行打包