好资料
0. QT程序打包注意事项
- 若采用VC编译器,除了应带有QT功能库之外,还应携带VC运行环境dll;
- VC运行环境dll:msvcp140.dll和vcruntime140.dll,均为32位;
1. 信号和槽
- 直接定义法(QT4和QT5两种定义方法、代码直接定义和编辑器定义)
/*关于信号的注意事项:
1.所有的信号声明都是公共的,所以Qt规定不能在signals前面加public,private, protected。
2.所有的信号都没有返回值,所以返回值都用void。
3.所有的信号都不需要定义。
4.必须直接或间接继承自QOBject类,并且开头私有声明包含Q_OBJECT。
5.当一个信号发出时,会立即执行其槽函数,等待槽函数执行完毕后,才会执行后面的代码,如果一个信号链接了多个槽,那么会等所有的槽函数执行完毕后才执行后面的代码,槽函数的执行顺序是按照它们链接时的顺序执行的。
6.在链接信号和槽时,可以设置链接方式为:在发出信号后,不需要等待槽函数执行完,而是直接执行后面的代码。
7.发出信号使用emit关键字。
8.信号参数的个数不得少于槽参数的个数。
*/
/*关于槽的注意事项:
1.槽其实就是普通的C++函数,它唯一特点就是能和信号链接。当和它链接的信号被发出时,这个槽就会被调用。
2.声明槽可以使用:public/protected/private slots:
3.以上是Qt4的做法,在Qt5中你也不需要使用这些声明,每个函数都可以被当作是槽函数,而且还可以使用Lambda表达式来作为槽。不过为了程序的可读性,我还是推荐槽函数要声明一下.
*/
connect(pushButton, SIGNAL(clicked()), dialog, SLOT(close()));
connect(pushButton, QPushButton::clicked, dialog, QDialog::close);
#include "widget.h"
#include <QLineEdit>
#include <QSignalMapper>
#include<QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
vLayout = new QVBoxLayout(this);
b1=new QPushButton("模态对话框",this);
b2=new QPushButton("非模态对话框",this);
b3=new QPushButton("自定义对话框",this);
vLayout->addWidget(b1);
vLayout->addWidget(b2);
vLayout->addWidget(b3);
connect(b1,&QPushButton::clicked,[=](){this->close();});
}
Widget::~Widget()
{}
//头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QPushButton *b1;
private slots:
void on_button1_released();
};
#endif // WIDGET_H
//主文件
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
resize(500,300);
b1=new QPushButton("CLOSE",this);
b1->move(200,200);
b1->setObjectName(QStringLiteral("button1"));
QMetaObject::connectSlotsByName(this);
}
Widget::~Widget()
{}
void Widget::on_button1_released()
{
this->close();
}
//总结
b1->setObjectName(QStringLiteral("button1")); //为对象设置名称
QMetaObject::connectSlotsByName(this); //启动该功能
void Widget::on_button1_released(); //可以直接写槽函数,则自动关联
#include "widget.h"
#include <QLineEdit>
#include <QSignalMapper>
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//创建垂直布局,将垂直布局作为主布局
QVBoxLayout* vLayout = new QVBoxLayout(this);
//创建编辑框,用于显示点击按钮的文字,并且文字在右边显示
QLineEdit* edit = new QLineEdit;
edit->setAlignment(Qt::AlignRight);
vLayout->addWidget(edit);//将编辑框加入到垂直布局中
//创建信号匹配器
QSignalMapper* signalMapper = new QSignalMapper(this);
//创建0-9数字键,并都加入到网格布局中
QGridLayout *gridLayout = new QGridLayout;
for (int i = 0; i < 10; ++i)
{
QString txt = QString::number(i);
QPushButton *button = new QPushButton(txt);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, txt);//将按钮和要发送的字符串配对
gridLayout->addWidget(button, i / 3, i % 3);//一行显示3列
}
//连接配对信号和设置文字槽
connect(signalMapper, SIGNAL(mapped(QString)),
edit, SLOT(setText(QString)));
vLayout->addLayout(gridLayout);
resize(200, 200);
}
Widget::~Widget()
{}
//总结:三大步骤
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, txt);//将按钮和要发送的字符串配对
connect(signalMapper, SIGNAL(mapped(QString)),edit, SLOT(setText(QString)));
2. 模态对话框和非模态对话框
#include "widget.h"
#include <QLineEdit>
#include <QSignalMapper>
#include<QDebug>
#include<QDialog>
#include "customdialog.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
vLayout = new QVBoxLayout(this);
b1=new QPushButton("模态对话框",this);
b2=new QPushButton("非模态对话框",this);
b3=new QPushButton("自定义对话框",this);
vLayout->addWidget(b1);
vLayout->addWidget(b2);
vLayout->addWidget(b3);
connect(b1,&QPushButton::clicked,[=](){
//显示模态对话框
QDialog* dlg = new QDialog(this);
dlg->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭后,自动销毁
dlg->setWindowModality(Qt::WindowModal);//或者可以使用setModel(true)
dlg->show();
});
connect(b2,&QPushButton::clicked,[=](){
//显示非模态对话框
QDialog *modellessDig=new QDialog;
modellessDig->setWindowTitle("非模态对话框");
modellessDig->setAttribute(Qt::WA_DeleteOnClose);
modellessDig->show();
});
connect(b3,&QPushButton::clicked,[=](){
//显示自定义对话框
CustomDialog *dlg=new CustomDialog(this);
dlg->setAttribute(Qt::WA_DeleteOnClose);
int ret = dlg->exec();
if (ret == QDialog::Accepted)
{
qDebug()<<"Accepted!";
}
else if (ret == QDialog::Rejected)
{
qDebug()<<"Rejected!";
}
});
}
Widget::~Widget()
{}
3.标准对话框
//输入对话框
int i = QInputDialog::getInt(this, tr("情况"),tr("几岁毕业"), 25, 16, 100, 1, &ok);
double d = QInputDialog::getDouble(this, tr("工作"),tr("一天挣多少钱"), 1000, 100, 10000, 1, &ok);
QStringList items;
items << tr("王者荣耀") << tr("Dota") << tr("Dota2") << tr("LOL");
bool ok;
QString item = QInputDialog::getItem(this, tr("游戏"),tr("你玩哪一个"), items, 0, false, &ok);
QString text = QInputDialog::getText(this, tr("发展"),tr("想跳槽吗"), QLineEdit::Normal,tr("懒"), &ok);
QString text = QInputDialog::getMultiLineText(this, tr("计划"),tr("下一步怎么做"), "走着瞧", &ok);
//颜色对话框
QColor color = QColorDialog::getColor(Qt::green, this, "选择颜色", QColorDialog::DontUseNativeDialog);
//字体对话框
QFont font =QFontDialog::getFont(&ok,this);
//文件夹对话框:
QString directory = QFileDialog::getExistingDirectory(this,"Get directory:","./");
//文件对话框
QString fileName = QFileDialog::getOpenFileName(this,"Open a file","./","All Files (*);;Text Files (*.txt)");
//打开多个文件对话框
QStringList files = QFileDialog::getOpenFileNames(this,"Open multiple files:","./","All Files (*);;Text Files (*.txt)");
//保存文件对话框
QString fileName = QFileDialog::getSaveFileName(this,tr("Save file:"),"./",tr("All Files (*);;Text Files (*.txt)"));
//提示对话框
qDebug()<<QMessageBox::critical(this, ("危险"), ("修路危险"), ("返回"), ("步行"), ("无视"));
qDebug()<<QMessageBox::information(this, "Notify", "Do you?", "No", "Really no");
qDebug()<<QMessageBox::question(this, ("Question"),("this or that?"),QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
4. 模板类和工具类
QString
QList
QLinkedList
QVector
QMap
QHash
QVariable
正则表达式
5. 窗口布局
(1) QSplitter
QSplitter小实例
//实例
QSplitter *splitterMain = new QSplitter(Qt::Horizontal, Q_NULLPTR);
QTextEdit *textLeft = new QTextEdit(QObject::tr("Left Widget"),splitterMain);
QTextEdit *textRight = new QTextEdit(QObject::tr("Right Widget"), splitterMain);
QTextEdit *textRight2 = new QTextEdit(QObject::tr("Right Widget2"), splitterMain);
splitterMain->setStretchFactor(1, 1);
splitterMain->setWindowTitle(QObject::tr("Splitter"));
splitterMain->show();
//一个QSplitter就是一个窗口QWidget
//setStretchFactor(int index,int factor)用法为关键:设置各个分割窗口的宽度或高度比例
//下面三行代码将设置水平分割窗口的宽度比例
splitterMain->setStretchFactor(0, 1);
splitterMain->setStretchFactor(1, 3);
splitterMain->setStretchFactor(2, 3);
//factor取值为整数,当其值为0表示固定宽度或高度,默认为0
(2) QDockWidget
setWindowTitle("李浩");
QTextEdit *te = new QTextEdit(this);
te->setText("Main Window");
te->setAlignment(Qt::AlignCenter);
setCentralWidget(te);
QDockWidget *dock1 = new QDockWidget("悬浮窗口1", this);
dock1->setFeatures(QDockWidget::DockWidgetMovable);
dock1->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
QTextEdit *te1 = new QTextEdit();
te1->setText("dock1, which can be moded to left or right side");
dock1->setWidget(te1);
addDockWidget(Qt::RightDockWidgetArea, dock1);
QDockWidget *dock2 = new QDockWidget("悬浮窗口2", this);
dock2->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
QTextEdit *te2 = new QTextEdit();
te2->setText("dock2, which can be closed and floated");
dock2->setWidget(te2);
addDockWidget(Qt::RightDockWidgetArea, dock2);
QDockWidget *dock3 = new QDockWidget("悬浮窗口3", this);
dock3->setFeatures(QDockWidget::AllDockWidgetFeatures);
QTextEdit *te3 = new QTextEdit();
te3->setText("dock3, all features");
dock3->setWidget(te3);
addDockWidget(Qt::RightDockWidgetArea, dock3);
(3) QStackedWidget
label1 = new QLabel("WindowTest1");
label2 = new QLabel("WindowTest2");
label3 = new QLabel("WindowTest3");
widget = new MyWidget();
stack = new QStackedWidget(this);
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);
stack->addWidget(widget);
stack->setCurrentIndex(1);
(4) 三种基本布局
QHBoxLayout
QVBoxLayout
QGridLayout
6. 中文乱码问题
参考资料
- QString::fromLocal8Bit(“你好”)
- QStringLiteral(“中国”)
-
pragma execution_character_set("utf-8") 此法最好呢
网友评论