qt学习记录-2

2 篇文章 0 订阅

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…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值