QT界面编写

问题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我会在写一篇,主要这样篇幅就有点大了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值