Qt基础和库
QObject
//删除
obj->deleteLater()或 delete obj
deleteLater会等这次事件循环结束再释放内存 必须在运行事件循环的线程中调用
//类型转化
QObject *obj = new QTimer; // QTimer inherits QObject
QTimer *timer = qobject_cast<QTimer *>(obj);
// timer == (QObject *)obj
QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
// button == 0
要转化的类必须继承QObject和声明Q_OBJECT宏
//查找子类
QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), Qt::FindDirectChildrenOnly);
//事件过滤
class KeyPressEater : public QObject
{
Q_OBJECT
...
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
};
bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
qDebug("Ate key press %d", keyEvent->key());
return true;
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
And here's how to install it on two widgets:
KeyPressEater *keyPressEater = new KeyPressEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView *listView = new QListView(this);
pushButton->installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);
//注册函数到原对象系统
Q_INVOKABLE void invokableMethod();
使用QMetaObject::invokeMethod(obj, "invokableMethod");
//原对象系统
跨线程连接信号和槽 参数不是qt基本类
使用
int id = qRegisterMetaType<MyStruct>();
所有要使用信号和槽的类 必须继承QObject和声明Q_OBJECT宏
//属性
Q_PROPERTY(type name
(READ getFunction [WRITE setFunction] |
MEMBER memberName [(READ getFunction | WRITE setFunction)])
[RESET resetFunction]
[NOTIFY notifySignal]
[REVISION int]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[CONSTANT]
[FINAL])
Q_PROPERTY(QString title READ title WRITE setTitle USER true)
//信号
signals:
void signal_1();
emit signal_1 发射信号
//槽
public slots:
void slot_1();
connect(obj, SIGNAL(signal_1), obj2, SLOT(slot_1));
c++11
connect(sender, &Sender::valueChanged, reciver, &Reciver::showValue)
lambad
connect(sender, &Sender::valueChanged, [](){
});
支持编译时检查, 支持相容类型自动转化, 可以连接任何函数不用声明 slot
如果信号和槽有重载:
connect(sender, static_cast<void(QSpinBox::*) (int)> (&QSpinBox::valueChanged)) ,
this, &MainWindow::onSpinBoxChanged);
qt基本容器
QList<T>
QLinkedList<T>
QVector<T>
QStack<T>
QQueue<T>
QSet<T>
QMap<Key, T>
QMultiMap<Key, T>
QHash<Key, T>
QMultiHash<Key, T>
//JAVA风格遍历
QList<QString> list;
list << "A" << "B" << "C" << "D";
QListIterator<QString> i(list);
while (i.hasNext())
qDebug() << i.next();
QListIterator<QString> i(list);
i.toBack();
while (i.hasPrevious())
qDebug() << i.previous();
//迭代器中 插入删除使用 QMutableMapIterator
QMap<QString, QString> map;
map.insert("Paris", "France");
map.insert("Guatemala City", "Guatemala");
map.insert("Mexico City", "Mexico");
map.insert("Moscow", "Russia");
...
QMutableMapIterator<QString, QString> i(map);
while (i.hasNext()) {
if (i.next().key().endsWith("City"))
i.remove();
}
//STL风格遍历
QList<QString> list;
list << "A" << "B" << "C" << "D";
QList<QString>::iterator i;
for (i = list.begin(); i != list.end(); ++i)
*i = (*i).toLower();
//反向迭代
QList<QString> list;
list << "A" << "B" << "C" << "D";
QList<QString>::reverse_iterator i;
for (i = list.rbegin(); i != list.rend(); ++i)
*i = i->toLower();
}
//只读
QList<QString>::const_iterator i;
for (i = list.constBegin(); i != list.constEnd(); ++i)
qDebug() << *i;
//foreach迭代---注意不要在迭代器里删除元素
QLinkedList<QString> list;
...
foreach (const QString &str, list) {
if (str.isEmpty())
break;
qDebug() << str;
}
数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "Project"); //数据库类型,别名
db.setDatabaseName("mysql"); db.setHostName("127.0.0.1");
db.setUserName("root");
db.setPassword("");
db.open();
//执行sql语句
query = QSqlQuery(QSqlDatabase::database("Project"));
query.exec("create table if not exists time_table (`time` text NOT NULL, `info` text)");
//查询表
query.exec(QString("select * from time_table"));
while (query.next()) {
QString info = query.value("info").toString();
foreach (QString timeInfo, allTimeInfoList) {
if(info.contains(timeInfo)) {
QStringList &list= m_timeSendList[QTime::fromString(query.value("time").toString(), "hh::mm::ss")];
if(!list.contains(info)) {
list.append(info);
}
break;
}
}
}
//tableview
model = new QSqlQueryModel(this);
ui->tableView->setModel(model);
model->setQuery(QString("SELECT *from %3 where time >= '%1' and time <= '%2'").
arg(ui->dateTimeEdit->dateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(ui->dateTimeEdit_2->dateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(m_table), QSqlDatabase::database("Project"));
//设置显示头
if(model->columnCount() >= 4) {
model->setHeaderData(0, Qt::Horizontal, tr("系统"));
model->setHeaderData(1, Qt::Horizontal, tr("描述"));
model->setHeaderData(2, Qt::Horizontal, tr("时间"));
model->setHeaderData(3, Qt::Horizontal, tr("操作者"));
} else {
model->setHeaderData(0, Qt::Horizontal, tr("描述"));
model->setHeaderData(1, Qt::Horizontal, tr("时间"));
model->setHeaderData(2, Qt::Horizontal, tr("操作者"));
}
添加相应 mysql库
linux
sudo apt install libmysql++-dev
复制相应库到 qt lib目录
windows
复制mysql安装目录 mysql.dll
HTTP
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,
this, &MyClass::replyFinished);
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
QNetworkRequest request;
request.setUrl(QUrl("http://qt-project.org"));
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");
QNetworkReply *reply = manager->get(request);
connect(reply, &QIODevice::readyRead, this, &MyClass::slotReadyRead);
connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
this, &MyClass::slotError);
connect(reply, &QNetworkReply::sslErrors,
this, &MyClass::slotSslErrors);
//使用
accessManager = new new QNetworkAccessManager();
//POST
void Common::post(const QString &url, const QString &data)
{
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
//request.setHeader(QNetworkRequest::ContentLengthHeader, data.size());
//request.setHeader(QNetworkRequest::ContentLengthHeader, data.size());
request.setUrl(QUrl(url));
QByteArray postData;
postData.append(data);
QNetworkReply* reply = accessManager->post(request, postData);
connect(reply, &QNetworkReply::finished, [this, reply, url]{
emit getmessage(reply->readAll());
reply->deleteLater();
});
}
void Common::get(const QString &url)
{
QNetworkRequest request;
request.setUrl(QUrl(url));
QNetworkReply* reply = accessManager->get(request);
connect(reply, &QNetworkReply::finished, [this, reply, url]{
QByteArray alldata = reply->readAll();
emit getmessage(alldata);
reply->deleteLater();
});
}
//JOSN
QMap<QString, QVariant> GFun::jsonParse(const QByteArray &jsonData)
{
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(jsonData, &jsonError); // 转化为 JSON 文档
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) { // 解析未发生错误
if (doucment.isObject()) { // JSON 文档为对象
QJsonObject object = doucment.object(); // 转