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

嗯。。。此次接了個單php

要求圖形界面,恰好能夠鞏固並學習下QT。堅決果斷的就接了html

下面記錄下出現的問題:數組

1. QWidget和QDialog

  QDialog下的槽函數有accept()與reject()能夠直接用app

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

  而QWidget則只有show()要本身寫阻塞函數

 

2. 窗口間通訊

  2.1 主窗口->子窗口

  介個方法不少啦工具

  我用的是直接傳值給子窗口裏的變量:學習

  好比說:ui

  子窗口有:this

 

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;

 

  從這三行中咱們能夠知道:

  一、QDataStream 可使用>> 和 << 流操做

  二、寫入文件的數據類型能夠獲得保留

  三、容許多種類型的數據,這裏有:QString、int、bool、char *

  (鑑於沒有bool *的…故而我先將bool[] 轉換爲char *數組(以’0’,’1’爲標誌) 寫入。讀取時再轉換回去便可)

  四、因爲有數據類型的存儲,故而存儲文件沒法用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等打包軟件進行打包

相關文章
相關標籤/搜索