qt學習記錄-2

exec、open、show區別

1. 在棧上創建對象:

  • show
QDialog dialog;
dialog.setWindowTitle("yeelight");
dialog.show();

結果:dialog窗口一閃而過

  • open
QDialog dialog;
dialog.setWindowTitle("yeelight");
dialog.open();

結果:dialog窗口一閃而過

  • exec
QDialog *dialog=new QDialog;
dialog.setWindowTitle("yeelight");
dialog.exec();

結果:dialog窗口保持顯示

2. 在堆上創建對象:

  • show
QDialog *dialog=new QDialog;
dialog->setWindowTitle("yeelight");
dialog->show();

結果:dialog窗口保持顯示

  • open
QDialog *dialog=new QDialog;
dialog->setWindowTitle("yeelight");
dialog->open();

結果:dialog窗口保持顯示

  • exec
QDialog dialog;
dialog->setWindowTitle("yeelight");
dialog->exec();

結果:dialog窗口保持顯示
結論:
1. open和show函數會立刻返回,exec函數會等到close信號後才返回。
2. 棧和堆上的對象的生命週期不同,對於對象的顯示有重要的影響。

Qt工程中mainwindow.ui分析記錄

mainwindow.ui文件本身分爲design模式和文本模式,只有在design模式(也就是圖形化界面下,纔可編輯),文本模式是xml格式的表述。我們通過main.cpp頂部包含的頭文件,打開ui_mainwindow.h文件,頂部的註釋告訴我們:這個文件的內容是根據讀取mainwindow.ui文件自動生成的,並且在重新編譯mainwindow.ui後,所有人工添加的改動都會丟失,就是不要在這裏編輯啦。

  1. 首先,在包含了一堆頭文件後,出現了一個QT_BEGIN_NAMESPACE,以及文件最後的QT_END_NAMESPACE,暫未了解。。。
  2. 然後定義了一個Ui_MainWindow類,在堆上定義了所有mainwindow.h上存在的控件。
    在這裏插入圖片描述
  3. 然後又定義了一個setupUi方法(是不是很眼熟):
    作用:設置控件尺寸和位置,並調用下面的retranslateUi方法設置控件初始屬性。
    在這裏插入圖片描述
  4. 再定義一個retranslateUi方法:
    作用:設置控件初始屬性。
    在這裏插入圖片描述
  5. 最後,定義了命名空間Ui,其中聲明瞭類MainWindow繼承於Ui_MainWindow
    在這裏插入圖片描述
  6. 總結:
  • ui_mainwindow.h中的MainWindow類和mainwindow.h中定義的MainWindow類同名了,但不是同一個類!前者用命名空間Ui封裝!詳細可閱讀這篇帖子
  • 先來張圖感受下:
    在這裏插入圖片描述
    注:
  • 派生類的構造函數中要先調用基類的構造函數!
  • 關於Ui命名空間中重複出現class MainWindow的理解

即:

1.mainwindow.cpp中引入"mainwindow.h中"中MainWindow是對`ui_mainwindow.h`中`Ui`域的聲明,如下:
namespace Ui {
class MainWindow;
}
 
2.mainwindow.cpp中引入的"ui_mainwindow.h"中MainWindow是定義,如下:
namespace Ui {
	//MainWindow繼承了Ui_MainWindow類,但是沒有添加任何新成員。
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

Qt連接sqlite

//
void MainWindow::db_connect()
{
#if 1
  db = QSqlDatabase::addDatabase("QSQLITE");
  db.setDatabaseName("C:\\Users\\NJKQ\\Desktop\\yeelight.db");
  if(!db.open()){
    QMessageBox::warning(NULL, "", "db open failed!");
    }
#endif
}

Qt連接MSSQL

參考:https://blog.csdn.net/valada/article/details/79909971
連接參數按照圖片中的格式,可以成功連接:
在這裏插入圖片描述
如:

void MainWindow::db_connect()
{
#if 1
  db = QSqlDatabase::addDatabase("QODBC");
  db.setConnectOptions("SQL_ATTR_CONNECTION_TIMEOUT=3;SQL_ATTR_LOGIN_TIMEOUT=3");
  db.setDatabaseName(QString("DRIVER={SQL SERVER};"
                             "SERVER=%1;"
                             "DATABASE=%2;"
                             "UID=%3;"
                             "PWD=%4;").arg("192.168.0.141")
                     .arg("Jl_Self_Zydsj")
                     .arg("sa")
                     .arg("123456"));

  if(!db.open()){
    QMessageBox::warning(NULL, "", "db open failed!");    
    qDebug() << "lastError:" << db.lastError().text() << endl;
    }
#endif
}

菜單欄中增加選項時,不僅可以是QMenu類,也可以是QAction類,如:

  //
  action=new QAction(this);
  action->setWhatsThis("it`s a tips");
  action->setText("xxx");

  file=QMainWindow::menuBar()->addMenu(tr("open"));
  file->addAction(action);
  file2 = file->addMenu("aaa");
  file3 = file2->addMenu("bbb");
  connect(action, &QAction::triggered, this, &fun);

在這裏插入圖片描述

waitting…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章