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
後,所有人工添加的改動都會丟失,就是不要在這裏編輯啦。
- 首先,在包含了一堆頭文件後,出現了一個
QT_BEGIN_NAMESPACE
,以及文件最後的QT_END_NAMESPACE
,暫未了解。。。 - 然後定義了一個
Ui_MainWindow
類,在堆上定義了所有mainwindow.h
上存在的控件。
- 然後又定義了一個
setupUi
方法(是不是很眼熟):
作用:設置控件尺寸和位置,並調用下面的retranslateUi
方法設置控件初始屬性。
- 再定義一個
retranslateUi
方法:
作用:設置控件初始屬性。
- 最後,定義了命名空間
Ui
,其中聲明瞭類MainWindow
繼承於Ui_MainWindow
:
- 總結:
- 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);