前言
因为项目用的是Qt4.8.3,所以特意学习了一下Qt4
现在Qt最新的版本是Qt6,公司的开发也多以Qt5为主,可能大家会感觉没有必要学习Qt4。但是我在学习的过程中,发现Qt4和Qt5的差别并不大,所以大家也可以学习一下Qt4,这样学习后面的版本也会容易很多
另外Hello,Qt5学习记录是以Qt的界面设计为主,而Hello,Qt4学习记录则是全面的记录了Qt4整个库的使用
环境搭建
Win10+Qt4.8.3+QtCreator2.4.1
考虑到学习成本,就不在vs平台上开发了,想在vs上开发的可以参考Hello,Qt5
理论上QtCreator可以用最新版本,但是适配性最好的还是同时期的版本
先装QtCreator2.4.1,然后安装Qt库4.8.3,在选择mingw目录时,设置为QtCreator2.4.1目录下的mingw目录
打开菜单栏中的工具->选项,打开构建和运行->Qt版本,选择添加,将4.8.3\bin中的qmake添加进去,选择应用、确定
在环境变量path中添加Qt4.8.3的bin目录路径
第一个QtCreator项目
打开QtCreator创建项目,选择Qt控件项目中的QtGUI应用,设置名称、路径,下一步直到完成
生成项目后,双击界面文件中ui文件进入Qt设计师界面
拖动QLabel控件到界面上,双击将其文本改为hello,点击左侧菜单栏的绿色运行箭头
demo:多窗口程序
目标
程序开始出现一个对话框,按下按钮后,对话框消失进入主窗口
如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出
当进入主窗口后,我们按下按钮,会弹出另一个窗口,主窗口不消失
实现
新建基类为QMainWindow的项目,进入ui设计界面,添加一个按钮,命名为“按钮”
在main.cpp中设置编码
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); //自动选择适合的编码
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); //指定编码
在构造函数中添加代码
ui->pushButton->setText("新窗口");
右击项目添加新文件选择Qt设计器界面类中Dialog without Buttons,创建完成后,会自动进入ui界面,拖入一个QPushButton,设置内容为“登录到主界面”,然后进入编辑信号/槽模式(双击为选中信号对象,双击后不要送开鼠标,会拖出一条线,连接到槽对象即完成信号槽的绑定),将QPushButton的clicked()信号和QDialog的accept()槽绑定
main.cpp
#include <QtGui/QApplication>
#include <QTextCodec>
#include <QDialog>
#include "mainwindow.h"
#include "logindialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
//QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
MainWindow w;
LoginDialog dlg;
if(dlg.exec() == QDialog::Accepted)
{
w.show();
return a.exec();
}
else return 0;
}
进入mainwindow界面,右击QPushButton选择转到槽,选择clicked()信号
void MainWindow::on_pushButton_clicked()
{
QDialog *dlg = new QDialog(this);
dlg->show();
}
总结
我们实现了两类窗口打开的方式,一个是自身消失后打开一个窗口,一个是打开另一个窗口自身也不消失
demo:登录对话框
目标
在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均正确则进入主窗口,如果有错则弹出警告对话框
实现
新建基类为QMainWindow的项目
右击项目添加Qt设计师类,选择Dialog with Buttons模板,类名为LoginDialog
在界面上放两个QLabel、QLineEdit、QPushButton,QLabel的文本分别设置为用户名、密码,QPushButton的文本设置为登录、退出,对象名设置为loginBtn、exitBtn,QLineEdit的对象名设置为usrLineEdit、pwdLineEdit
将loginBtn的clicked()信号与LoginDialog的close()槽绑定
将exitBtn的clicked()信号与LoginDialog的accept()槽绑定
mian.cpp
#include "mainwindow.h"
#include "logindialog.h"
#include <QtGui/QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
MainWindow w;
LoginDialog dlg;
if(dlg.exec() == QDialog::Accepted)
{
w.show();
return a.exec();
}
else return 0;
}
logindialog.h
#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H
#include <QDialog>
#include <QMessageBox>
namespace Ui {
class LoginDialog;
}
class LoginDialog : public QDialog
{
Q_OBJECT
public:
explicit LoginDialog(QWidget *parent = 0);
~LoginDialog();
private slots:
void on_loginBtn_clicked();
private:
Ui::LoginDialog *ui;
};
#endif // LOGINDIALOG_H
logindialog.cpp
#include "logindialog.h"
#include "ui_logindialog.h"
LoginDialog::LoginDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::LoginDialog)
{
ui->setupUi(this);
ui->usrLineEdit->setPlaceholderText(tr("请输入用户名"));
ui->pwdLineEdit->setPlaceholderText(tr("请输入密码"));
ui->pwdLineEdit->setEchoMode(QLineEdit::Password);
}
LoginDialog::~LoginDialog()
{
delete ui;
}
void LoginDialog::on_loginBtn_clicked()
{
if(ui->usrLineEdit->text().trimmed() == tr("yi") &&
ui->pwdLineEdit->text() == tr("123456"))
{
accept();
}
else
{
QMessageBox::warning(this,
tr("Warning"),
tr("usr or pwd error!"),
QMessageBox::Yes,
QMessageBox::No);
ui->usrLineEdit->clear();
ui->pwdLineEdit->clear();
ui->usrLineEdit->setFocus();
}
}