常见操作
数据类型
C++—>QT
- int—-int
- char—-Qchar
- double—-double
- float—-float
- bool—-bool
- void—-void
- enum—-enum
- string—-QString
QString str;声明 str.append(str2);末尾追加 int length = str.size();查看长度 QChar ch = str[0]; ```
9. QTimer处理时间
```c++
|
- QColor处理颜色
- QPixmap处理图像
- QImage处理图像
- QObject,基类
- QByteArray—-char*,可用于创建动态数组。
声明 QByteArray byteArray; byteArray.append("Hello", 5);末尾追加 append(const QByteArray &other);末尾 char byte = byteArray[i];遍历,值赋给byte; 包含头尾追加,定点删除替换,清空。
|
- QVariant,联合其他不同种类数据
- QPoint,表示X,Y轴坐标
QPoint point; QPoint point(x,y); point.setX(x); point.setY(y);设置 point.x(); point.y();访问
|
- QLine,两点一线
QLine line; 同16一致,对$X_1,y_1,X_2,y_2$四个参数操作
|
- QSize,表示宽高
- QRect,表示矩形
Qrect rect; 同17,但按顺序包含$X_1(左上角),y_19(右上角),宽,高$的顺序
|
……
输入输出
需要include
qDebug()<<”hello”;
将把“ ”内的内容写入日志
信号槽
配件和配件间交流的方法。 相比于return ,信号槽可以进行一些额外操作。 能返回多个信号,对应多个值,实现多个操作。 connect(button, SIGNAL(clicked()), &a, SLOT(quit())); 从左到右依次为,信号发出对象,信号行为,接收对象,接收动作。
|
class MyBook : public QObject,必要继承 { Q_OBJECT,必要宏 public: MyBook(QObject *parent = 0) : QObject(parent)随手赋值 {} void send() { emit sendSignal(as); }发送信号 signals: void sendSignal(&as);信号为as private: char as;创建as }
|
class MyMark : public QObject,必要继承 { Q_OBJECT,必要宏 public: MyMark() void receive(const Qstring &as) { qDebug() << as; }拿到信号后的行为(槽) }
|
#include<QCoreApplication> #include "MyBook" #include "MyMark" int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); MyBook *book = new MyBook; MyMark *mark = new MyMark; connect(book, SIGNAL(sendSignal(QString)), mark, SLOT(receive(QString)));连接搭建 book->send();发出信号,与动作绑定的信号槽连接 return app.exec(); }
|
交互插件
- QPushButton
#include<QPushButton>
初始化 QPushButton *button = new QPushButton("test",this);this为当前的窗口,“”内为按钮信息
按键位置 button->setGeometry(x,y,w,h);设置按钮位置,以$x,y,w,h$的方式
按键策略 QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);Expanding为扩展,Fixed为固定 button->setSizePolicy(sizePolicy); button->setMinimumSize(QSize(60, 20)); button->setMaximumSize(QSize(240, 80)); 会根据窗口的大小为按键自动变换大小,但不超过min和max
数组 vector<QPushButton*> button; 对应的初始化: button.push_back(new QPushButton("test",this));
|
- QLabel
- QLineEdit
- QTextEdit
- QFileDialog
- QMessageBox
- QColorDialog
窗口
- QMainWindow
- QDialog
- QWidget
- QFrame
- QGroupBox
- QToolBox
- QToolBar
- QStatusBar
- QMenuBar
- QMenu
- QDockWidget
- QTabWidget
- QStackedWidget
用于页面的无缝切换。 使用方法: 1.加入QStackedWidget的页面需要new出来 2.该页面要用stack->addWidget(Widget)加入 3.第一种设置当前页面:stack->setCurrentWidget(this); 根据页面名搜索 第二种设置当前页面:stack->setCurrentIndex(index); 根据索引搜索(索引不会因为其他页面被释放而改变) 4.展示页面stack->show();
|
布局
Qt布局操作旨在帮助您在用户界面中组织和定位控件,确保它们在不同屏幕尺寸和分辨率下都能正确显示和响应窗口大小变化。
- QHBoxLayout,QVBoxLayout
···c++ 水平布局,垂直布局
声明 QHBoxLayout *layout = new QHBoxLayout; 后者同理
间隔 vlayout->setSpacing(100); // 设置组件之间的间距为100像素
边距 hlayout->setContentsMargins(0, 0, 120, 120); // 设置布局四周的边距
添加元件 hlayout->addWidget(button);
放置伸缩空间(类似于空格 hlayout->addStretch();
镶嵌布局 类似于添加元件,但会自动填充剩余空间 hlayout->addWidget(buttonwidget); 此处添加的buttonwidget为QWidget类型的包含按钮的小部件,需要先声明
|
- QGridLayout
类似于c++中的数组,但需要指定行列数
```c++ QGridLayout *gridLayout = new QGridLayout(this); 声明
gridLayout->setSpacing(10); 间隔
for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { gridLayout->addWidget(Label, i, j); } } 添加
|
得到的效果较好,各个label可以紧凑起来,若在行或列方向有空隙,则可能需要为水平或垂直布局加入addstretch()
文件
读取
#include<QFile> #include<QTextStream> QFile file("test.txt");打开文件 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))判断是否打开。是,则继续 readonly表示只读,Text表示转换规范 QTextStream in(&file);创建文本流对象 while (!in.atEnd())直到读完 { QString line = in.readLine(); } file.close();关闭文件
|
拖拽
需要重写Label类
$droplabel.h$
#ifndef DROPLABEL_H #define DROPLABEL_H
#include <QLabel> #include <QWidget> #include <QMouseEvent> #include <QDrag> #include <QMimeData> #include <QApplication> #include <QGraphicsDropShadowEffect> #include <QGridLayout>
class DropLabel : public QLabel { Q_OBJECT public: explicit DropLabel(QWidget *parent = nullptr); void putpost(int,QGridLayout*); void set_txt(); void findlabel(int); protected: void dragEnterEvent(QDragEnterEvent *event) override; void dropEvent(QDropEvent *event) override; private: int post; QGridLayout* grid; };
#endif
|
$droplabel.cpp$
#include "DropLabel.h" DropLabel::DropLabel(QWidget *parent) : QLabel(parent) { setAcceptDrops(true); }
void DropLabel::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } else { event->ignore(); } }
void DropLabel::dropEvent(QDropEvent *event) { QString droppedText = event->mimeData()->text(); if (droppedText=="1") { setText("byd"); int num1=post+1; if(num1>0&&num1<36) { findlabel(num1); } event->accept(); } }
void DropLabel::putpost(int i,QGridLayout* g) { post=i; grid=g; }
void DropLabel::set_txt() { setText("byd"); } void DropLabel::findlabel(int i) { int x=i/6; int y=i%6; QWidget *widget = grid->itemAtPosition(x, y)->widget(); DropLabel *dropLabel = qobject_cast<DropLabel*>(widget); dropLabel->set_txt(); }
|
$draglabel.h$
#ifndef DRAGLABEL_H #define DRAGLABEL_H
#include <QWidget> #include <QLabel> #include <QMouseEvent> #include <QDrag> #include <QMimeData> #include <QApplication> #include <QGraphicsDropShadowEffect> #include <QString> #include <QGraphicsPixmapItem> #include <QGraphicsScene> #include <QPainter>
class DragLabel : public QLabel { Q_OBJECT public: explicit DragLabel(QWidget *parent = nullptr); void put_text(QString); protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; private: QString text; QPoint dragStartPos; };
#endif
|
$draglabel.cpp$
#include "DragLabel.h"
DragLabel::DragLabel(QWidget *parent) : QLabel(parent) { setMouseTracking(true); setCursor(Qt::OpenHandCursor); }
void DragLabel::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { dragStartPos = event->pos(); } QLabel::mousePressEvent(event); } void DragLabel::put_text(QString t) { text=t; } void DragLabel::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { QPoint diff = event->pos() - dragStartPos; if (diff.manhattanLength() < QApplication::startDragDistance()) { return; }
QPixmap originalPixmap = pixmap(Qt::ReturnByValue); QGraphicsScene scene; QGraphicsPixmapItem *pixmapItem = scene.addPixmap(originalPixmap); QGraphicsBlurEffect *blurEffect = new QGraphicsBlurEffect; blurEffect->setBlurRadius(5); pixmapItem->setGraphicsEffect(blurEffect); QImage blurredImage(scene.width(), scene.height(), QImage::Format_ARGB32); QPainter painter(&blurredImage); scene.render(&painter); QPixmap blurredPixmap = QPixmap::fromImage(blurredImage);
QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text); drag->setMimeData(mimeData); drag->setPixmap(blurredPixmap); drag->setHotSpot(QPoint(0, 0)); drag->exec(); } QLabel::mouseMoveEvent(event); }
|
$main.cpp$
QHBoxLayout * a=new QHBoxLayout(this); QGridLayout *gridLayout = new QGridLayout(this); for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { DropLabel *dropLabel = new DropLabel(this); dropLabel->putpost(i*6+j,gridLayout); dropLabel->setText(QString::number(i * 6 + j + 1)); gridLayout->addWidget(dropLabel, i, j); } }
DragLabel *dragLabel = new DragLabel(this); dragLabel->put_text("1"); QPixmap pixmap(":/D:/图片/实训/4.png"); dragLabel->setPixmap(pixmap); a->addLayout(gridLayout); a->addWidget(dragLabel);
|
接下来,就可以使用拖拽了。
其中,拖拽时的虚影固定在鼠标右下角,方便操作
比比几句
QT中当父类Widget销毁时,子类Widget也会销毁.即传入了父类指针的对象,子类会自动销毁。不放心的话可以用delete来手动销毁。