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.youkuaiyun.com/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);