嗯。。。這次接了個單
要求圖形界面,剛好可以鞏固並學習下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等打包軟件進行打包