QT学习过程中遇到的问题与总结

学习总结

1.软件
Kits中有许多你安装时下载的编译套件
MSVC: Microsoft VC,黄色感叹号解决方法
VS installer-使用C++的桌面开发-Window 10 SDK下载-单个组件-搜索MSVC对应版本生成工具并下载
MinGW: minimalis GNU on Windows
UWP:Windows通用应用平台
在左边项目中可以激活某个编译套件(右键),也可以取消激活某个编译套件

左边的小电脑可以切换运行的项目,当前运行项目在项目文件栏会加粗


2.连接
connect(发送者, 信号, 接收者, 槽函数)两种方式
connect(ui->lineEdit, &QLineEdit::returnPressed, this, &Widget::test);
connect(ui->lineEdit, SIGNAL(returnPressed()), this, SLOT(test()));


3. 函数参数未使用时
Q_UNUSED(函数参数);


4. 常用控件
pushButton:
头文件:QPushButton
QPushButton * button = new QPushButton (this);
button->move()
button->resize()
button->setStyleSheet(“;” “;”)

label
lineEdit
textEdit
LCDNumber
QSlider 使用value获取值


5. 定时器
头文件:QTimer
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &QWidget::slot)
timer->start(1000)
timer->setInterval(1000)
timer->stop();


6. 鼠标键盘事件
头文件:QKeyEvent, QMouseEvent
在头文件声明函数(重载事件函数):
void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event);

void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
键盘:event->key(), Qt::Key_W;
鼠标:event->button(), Qt::LeftButton;部件/窗口->setMouseTracking(true)

想要让鼠标按下时使mouseMoveEvent函数生效,判断条件:event::buttons() & Qt::LeftButton,使用这个结合move函数可以实现自定义拖动组件.


7. 让其他ui显示
创建一个设计师界面,你想在哪个界面调用该设计师界面,就在这个界面导入设计师界面对应的.h文件,之后创建这个页面的类,和实例化按钮类似,之后使用实例化的指针可以设置设计师页面的位置,大小.原来的界面如果像关闭就使用界面指针.close()关闭.


8. 获取主窗口绝对位置
可以使用this指针,如this->x();


9. 实现无边框窗口
在窗口设置父容器时指定flag(setParent函数第二个参数),在帮助中查询Qt::WindowFlags的参数.


10. frame
QFrame* frameTop  = new QFrame(this);
frameTop->setGeometry(0, 0, 800, 25)
frameTop->setStyleSheet(字符串)


11. layout
QHBoxLayout* topBox = * QHBoxLayout(frameTop)
topbox->setMargin(0);
topBox->setSpacing(7);
topBox->setSizeConstraint(QLayout::SetMinimumSize);(按钮不要忘了设置最小值,否则会被压缩)
topBox->addWidget(部件);

QSpacerItem* topSpacer = new QSpacerItem(20, 20, QSizePolicy::Expanding);
topBox->insertSpacerItem(9位置, topSpacer)
layout中的部件如果一开始直接放进去没有设置部件的空间位置,那么默认都是(0, 0),要想获得部件的位置,可以在加载玩界面,之后绑定一个函数,如点击,在点击的函数内使用layout->itemat(索引值)->geometry()->x()获取.
对于索引值的选择,如果与函数名有关,可以使用”_ _ func_ _”获取函数名,之后用下标获得想要的数字.


12. widget
QWidget* myWidget = new Qwidget(this)
myWidget->setGeometry(0 ,25, 100, 100);
myWidget->setStyleSheet(字符串)

QGraphicsDropShadowEffect* widgetShadow = new QGraphicsDropShadowEffect();
widgetShadow->setOffset(0, 0)
widgetShadow->setColor(Qt:black)
widgetShadow->setBlurRadius(10);

myWidget->setGraphicsEffect(widgetShadow)


13. 窗口变化事件
QResizeEvent
在private中重载函数
void resizeEvent(QResizeEvet* event)
之后在函数中写出需要变化的部件的修改的代码.


14. attribute
窗口->setAttribute(参数)
参数:
Qt::WA_DeleteOnClose 关闭窗口会销毁窗口回收内存
Qt::WA_QuitOnClose 离开


15. 网络编程
QUdpSocket* udpSocket = new QUdpSocket(this)
quint16 port = 9999;
udpSocket->bind(port, QUdpSocket::ShareAddresss | QUdpSocket::ReuseAddressHind )
前面的允许其他服务使用一样的地址与端口,后面失败重传

发送端
QByteArray arr;
QDateStream stream(&arr, QIODevice::WriteOnly)
stream<<数据<<name<<type<<time<<等等
udpSocket->writeDatagram(arr.data(), arr.length(), QHostAddress::Broadcast, port)

接收端
qint64 size = udpSocket->pendingDatagramSize()
int mysize = static_cast<int>(size) 将qint64类型数据转为int
QByteArray arr= QByteArray(mysize, 0);
QDataStream stream(arr, QIODevice::ReadOnly)
udpSocket->readDatagram(arr.data(), size);
stream>>数据>>name>>等等

绑定
connect(udpSocket, &UdpSocket::readyRead, this, &接收函数)
connect(发送按钮, 点击事件, this, [=](){调用函数})用lambda函数避免信号槽函数参数不一致.


udpSocket::disconnectFromHost()
udpSocket::close()
udpSocket::abort()
其中, abort 调用了 close, close 调用了 disconnectFromHost。 abort 立即关闭套接字,并丢弃写缓冲区中的所有待处理数据。close 关闭套接字的 IO,以及套接字的连接。可以写在closeEvent函数中(最好).因为如果写到析构函数不能保证真的调用.
可以写在关闭事件中(推荐),在窗口管理类可以调用关闭窗口
udpSocket::close()
udpSocket::destroyed()


16. 把窗口置顶/上移
第一种
窗口->hide()
窗口->show()
窗口会闪烁,但是没有窗口优先级问题
第二种
窗口->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Widget)
窗口-> setWindowFlags(NULL)
窗口->show()
窗口闪烁,标题在某种情况下会消失(flags,解决办法使用flag,只能传一个参数,不可以null,设置Qt::Widget) 
窗口->setFlag(Qt::WindowStaysOnTopHint);
窗口->setFlag(Qt::Widget);
没有使用null,不用使用show
第三种
QWindow* pWin = 窗口->windowHandle()
pWin->setFlags
pWin->setflag
与上面格式类似
第四种
QWindow* pWin = 窗口->WindowHandle()
pWin->raise()
推荐使用这个
另外子窗口在父窗口可以设置flag为dialog


17. 表格
ui->tableWidget->insertRow(0);在第零行添加一个空行
QTableWidgetItem* item = QTableWidgetItem(内容)
ui->tableWidget->setItem(0, 0, item)在第零行第零列添加item


18. lambda函数
匿名函数,C++11特性,在pro文件加CONFIG += C++11,现在内置了
[](){}
可以不用定义槽函数
在{}中无法使用外部变量与类成员变量, 中括号中写传入的值,可以在{}中使用,如果是[=]可以把局部变量与类成员变量以值传入{},[a, b, button],用[=]会设置只读在函数内无法修改外部的局部变量.要想修改可以[=]()mutable{}
()中写参数
{}中写函数主体


19. 把程序彻底关闭
QApplication库
qAPP->quit()或者
qApp->exit(0);


#遇到的问题


#.1. 安装问题
安装到D盘,专门创建一个文件夹放QT项目(不能有中文与空格)


#.2. 将构建目录放在指定路径下
工具-选项-构建与运行- Default Build Properties- ../你的目录/%{JS: Util.asciify("build-%{Project:Name}-%{Kit:FileSystemName}-%{BuildConfig:Name}")}
之后去项目文件夹删去.pro.user文件重新打开qt


#.3. 在自己创建的函数中创建按钮不显示
用指针创建好按钮后,再调用该按钮的show函数.


#.4. static assertion failed:Signal and slot arguments are not compatible
信号与槽函数参数不一致。要么参数类型数量一致,要么信号参数数量大于槽函数且顺序一致,因此当想要执行的函数的参数与信号不一致时,可以使用lambda表达式,[=](参数类型){}


#.5. 快捷键
alt+enter 快速创建函数的定义
F2 打开函数的定义
ctrl+ D前进
F4 切换头文件源

Alt+鼠标选区 批量修改,当一列变量相似且需要批量修改时可以使用这个

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星如雪_梭如月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值