程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 關於qt學習的一點小記錄(2),qt學習記錄

關於qt學習的一點小記錄(2),qt學習記錄

編輯:C++入門知識

關於qt學習的一點小記錄(2),qt學習記錄


嗯。。。這次接了個單

要求圖形界面,剛好可以鞏固並學習下QT。毫不猶豫的就接了

下面記錄下出現的問題:

1. QWidget和QDialog

  QDialog下的槽函數有accept()與reject()可以直接用

  並且QDialog有exec() 這種方式顯示窗口,是阻塞形的

  而QWidget則只有show()要自己寫阻塞

 

2. 窗口間通信

  2.1 主窗口->子窗口

  介個方法很多啦

  我用的是直接傳值給子窗口裡的變量:

  比如說:

  子窗口有:

 

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前先將參數傳入即可

 

 

  2.2 子窗口->主窗口

  子窗口給主窗口傳遞可以用信號槽解決

  不過在這裡因為我使用的還是直接調用子窗口的變量…

 

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來修改刪除

 

3. QDataStream使用

  其中之一構造函數:

  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 的 寫入同理可知,不再贅述。

 

 

4. 工具條裡添加圖標

  如圖:

  

  可以在QT設計器界面中找到:

 

  

 

  點擊新建

 

  

 

  然後重要的一部。。將動作編輯器的一個條目拖動到窗口動作條上。。。

  (這一步我研究了好久才發現。。。原來可以拖!!!!!)

  然後給主窗口添加幾個槽

  在信號槽編輯器將動作鏈接上槽即可

  點擊信號一般是triggred()

  如圖 :

 

  

 

 

5. VS+qt中給exe文件設置圖標

  1.在項目文件夾裡創建名為*.rc的文件,如myapp.rc。
  2.文件中寫入IDI_ICON1 ICON DISCARDABLE "myapp.ico" 其中,myapp.ico為圖標的文件名。
  3.將文件myapp.ico拷貝到項目文件夾內。
  4.在解決方案資源管理器中,右鍵點擊項目,添加myapp.rc及myapp.ico。
  5.重新生成解決方案。

 

6. VS+QT打包發布

 

  1. 添加qt的bin/目錄進系統path變量。很簡單,在系統屬性裡設置,添加C:\Qt\Qt5.4.0\5.4\msvc2013_64\bin; 到系統path環境變量

  2. 在任意目錄新建文件夾,把編譯完成後的qt exe可執行程序拷貝過去。

    從命令行模式進入該文件夾,執行語句windeployqt xxxx.exe

      之後該工具會分析程序依賴性,自動添加必要dll文件至該目錄。

  3. 使用NSIS等打包軟件進行打包

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved