Qt使用和常用代码

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();  // 转
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值