问题1:qt 4+版本无法直接显示汉字,可以会乱码
解决方案参考:https://www.cnblogs.com/cnjy/p/6114814.html ps(qt4+版本都会有乱码现象产生)
widge界面,就是编译生成一个最小对话框
这两个一个是加入的头文件,然后就是定义菜单下的行为,比如登入,注销等
先建立管理菜单
下面就是改变主对话框的大小
下面是子对话框的设计,登入、注销、退出,执行脚本等等,同时里面还加了快捷方式,这里面还调用了两个函数,就是层叠和并列,只是管理主界面下面的子界面。有利于界面的美观。
void MainWindow::createActions()
{
loginAction = new QAction(tr("登录"),this);
loginAction->setShortcut(tr("Ctrl+u"));
connect(loginAction, SIGNAL(triggered()), this, SLOT(on_login()));
logoutAction = new QAction(tr("注销"),this);
logoutAction->setShortcut(tr("Ctrl+b"));
connect(logoutAction, SIGNAL(triggered()), this, SLOT(on_logout()));
exitAction = new QAction(tr("退出"),this);
exitAction->setShortcut(tr("Ctrl+w"));
connect(exitAction, SIGNAL(triggered()), this, SLOT(on_exit()));
scriptAction = new QAction(tr("执行脚本"),this);
scriptAction->setShortcut(tr("Ctrl+p"));
scriptAction->setEnabled(false);//设置执行脚本这个行为为不可用
connect(scriptAction, SIGNAL(triggered()), this, SLOT(on_script()));
cascadeAction = new QAction(tr("层叠"), this);
cascadeAction->setShortcut(tr("Ctrl+Q"));
connect(cascadeAction, SIGNAL(triggered()), this, SLOT(cascadeSubWindows()));
tileAction = new QAction(tr("并列"), this);
tileAction->setShortcut(tr("Ctrl+r"));
connect(tileAction, SIGNAL(triggered()), this, SLOT(tileSubWindows()));
helpAction = new QAction(tr("帮助"), this);
helpAction->setShortcut(tr("Ctrl+s"));
connect(helpAction, SIGNAL(triggered()), this, SLOT(on_help()));
aboutAction = new QAction(tr("关于"), this);
aboutAction->setShortcut(tr("Ctrl+t"));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(on_about()));
}
这里有一个注意点,就是不仅仅我们按退出键就退出,还是窗口只带的两个退出,当然qt把这两个封装的很好,已经帮我们关联起来了。
上面是登入菜单的代码,setshortcut为快捷登入方式。
这里的小技巧,可以提高编码效率,就是槽函数可以用alt+enter,可以直接在mainwindow里面直接生成函数
小技巧:
QMessageBox::information(this, "","hello world!");用来测试两者是否相连
我们可以用qmessagebox来判断哪个按钮是否有效。
void MainWindow::closeEvent(QCloseEvent *event)
{
//通过question函数的返回值来判断用户到底点击的是yes还是no
QMessageBox::StandardButton button = QMessageBox::question(this, "提示",
"是否退出程序",
QMessageBox::Yes | QMessageBox::No);
if (button == QMessageBox::Yes)
{
event->accept();//如果用户点击yes,接受退出
}else
{
event->ignore();//否则,不接受退出
}
}
这个是用按钮来控制是否退出,accept是接受退出,ignore()是不接受退出。这个用来QMessageBox里面的question里面的问题来进行确认。
void MainWindow::on_exit()
{
close();
}
这个和c函数里面exit(0)有很大区别,exit是强制退出,就是什么也没有了。不会主动调用event的相关函数。这里的close会调用判断函数是否退出
新建文件loginlog,基类QDialog,建立一个登入界面,用户名,密码,ip,增加程序可读性。
//当子窗口的范围查过父窗口的显示范围时,父窗口自动添加横向滚动条。
mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
//当子窗口的范围查过父窗口的显示范围时,父窗口自动添加纵向滚动条。
mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
setWindowIcon(QIcon("main.png"));//设置窗口光标
设置密码为不可见
这个可以解决用户登入,后面主对话框不可用,因为在我们的逻辑中,那个登入界面只有一个,按下登入界面,我们只有等待登入界面消失才可以进行其他事情。
下面是优化登入界面
layout1->addWidget(label0, 0, 0);
layout1->addWidget(lineEditUserID, 0, 1);
layout1->addWidget(label1, 1, 0);
layout1->addWidget(lineEditPasswd, 1, 1);
layout1->addWidget(label2, 2, 0);
layout1->addWidget(lineEditDBName, 2, 1);
layout1->addWidget(label3, 3, 0);
layout1->addWidget(lineEditHostIP, 3, 1);
layout1->addWidget(loginBtn, 4, 0);
layout1->addWidget(logoutBtn, 4, 1);
layout1->setColumnStretch(0, 1);//设置0列
layout1->setColumnStretch(1, 1);//设置1列
layout1->setMargin(15);//设置layout边距
layout1->setSpacing(10);//设置layout当中控件和控件之间的间距.
layout1->setSizeConstraint(QLayout::SetFixedSize);//设置对话框大小不可改变
美化登入界面
设置登入界面大小不可变
我们要插入照片的时候,将要插入的照片放到以下目录。
view1->setStyleSheet("border-image: url(3.jpg);");//设置widget背景图片
w1->setAttribute(Qt::WA_DeleteOnClose);//代表关闭这个widget的时候,自动将这个widget delete。
void MainWindow::cascadeSubWindows()
{
mdiArea->cascadeSubWindows();
}
void MainWindow::tileSubWindows()
{
mdiArea->tileSubWindows();
}
层叠和并列
这里登入遇到问题:
加一个bool flag,初始为0,当按下确定键的时候为真。
//当子窗口的范围查过父窗口的显示范围时,父窗口自动添加横向滚动条。
mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
//当子窗口的范围查过父窗口的显示范围时,父窗口自动添加纵向滚动条。
mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
void MainWindow::showview()
{
QStandardItemModel *model = new QStandardItemModel(5, 3);//要建立一个5行3列的
//设置modul的列头名称
model->setHeaderData(0, Qt::Horizontal, "姓名");
model->setHeaderData(1, Qt::Horizontal, "性别");
model->setHeaderData(2, Qt::Horizontal, "年龄");
//设置modul的每一个单元格的内容
model->setData(model->index(0, 0, QModelIndex()), "张三");
model->setData(model->index(0, 1, QModelIndex()), "男");
model->setData(model->index(0, 2, QModelIndex()), "20");
model->setData(model->index(1, 0, QModelIndex()), "李四");
model->setData(model->index(1, 1, QModelIndex()), "男");
model->setData(model->index(1, 2, QModelIndex()), "30");
model->setData(model->index(2, 0, QModelIndex()), "王五");
model->setData(model->index(2, 1, QModelIndex()), "女");
model->setData(model->index(2, 2, QModelIndex()), "10");
model->setData(model->index(3, 0, QModelIndex()), "赵六");
model->setData(model->index(3, 1, QModelIndex()), "女");
model->setData(model->index(3, 2, QModelIndex()), "40");
model->setData(model->index(4, 0, QModelIndex()), "王麻子");
model->setData(model->index(4, 1, QModelIndex()), "男");
model->setData(model->index(4, 2, QModelIndex()), "30");
QTableView *view1 = new QTableView;
view1->setAttribute(Qt::WA_DeleteOnClose);//view在close的时候自动会delete,这个时候如果view有modul的话,这个modul会被view自动释放。
mdiArea->addSubWindow(view1);
view1->setStyleSheet("border-image: url(3.jpg);");//设置widget背景图片
//view1继承自widget,如果没有modul,那么view不会显示任何数据.
view1->setModel(model);
view1->show();
mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);
}
这里的model与view是共生存的,等没有model的时候,是生成不了view的
public slots:
private:
QLabel *label0;
QTextEdit *textEditSQL;
QPushButton *okBtn;
QPushButton *cancelBtn;
windows下面的cmd可以连接虚列机下面的数据库
这边一定这个功能,这个就相当于硬件设施要实现,才能实现软件设施。
user目录下加的数据库的路径:LIBS += -LC:\mysql\lib -llibmysql
当我们添加成功后,我们写下sql后面就有其他信息产生了,sql.connect调用ip、用户名称、密码、数据库名称,这里看是否能链接的上去,能链接上去就代表成功。
if (dlg.islogin)//代表用户点击了dlg对话框的登录按钮
{
int res = db.sql_connect(dlg.hostip.toStdString().data(),
dlg.userid.toStdString().data(),
dlg.passwd.toStdString().data(),
dlg.dbname.toStdString().data());
if (res == -1)
{
QMessageBox::information(this, "登录失败",db.geterror());
}else
{
QMessageBox::information(this, "","登录成功");
scriptAction->setEnabled(true);
}
/*
if ((dlg.userid == "abc") && (dlg.passwd == "123456"))
{
QMessageBox::information(this, "", "登录成功");
}else
{
QMessageBox::information(this, "", "登录失败");
}
*/
}
}
用qmessagebox里面的question进行判断
void MainWindow::on_logout()
{
QMessageBox::StandardButton button = QMessageBox::question(this, "提示",
"是否注销",
QMessageBox::Yes | QMessageBox::No);
if (button == QMessageBox::Yes)
{
db.sql_disconnet();
scriptAction->setEnabled(false);
}
}
这个是注销登入代码
因为要登入上去才可以使用这些执行脚本
类似于我们硬件芯片中的使能引脚
下面的如何调用mysql我会在写一篇,主要这样篇幅就有点大了。