wordpress导航站源码,网站页脚怎么做美观,个人音乐分享网站源码,wordpress进不了后台继续讲一些Qt开发中的技巧操作#xff1a; 1.新窗口控件用智能指针 通过对Qt自带Examples的源码研究你会发现#xff0c;越往后的版本#xff0c;越喜欢用智能指针QScopedPointer来定义对象#xff0c;这样有个好处就是用的地方只管new就行#xff0c;一直new下去#xf…继续讲一些Qt开发中的技巧操作 1.新窗口控件用智能指针 通过对Qt自带Examples的源码研究你会发现越往后的版本越喜欢用智能指针QScopedPointer来定义对象这样有个好处就是用的地方只管new就行一直new下去不用担心资源释放问题智能指针会给你在合适的时机释放相当于可以少些一行代码 xxx-deleteLater(); 而且避免不必要的麻烦不然很多地方你要判断 if (!xxx) 看下对象是否存在。
QWidget *widget;
//用的地方先new
widget new QWidget;
//用完释放对象
widget-deleteLater();
//智能指针写法
QScopedPointerQWidget widget;
//只管new尽管new不用管释放
widget.reset(new QWidget);2.将一些配置类变量封装起来 在编写类中有时候需要对变量进行赋值和取值这时候一般用 setxxx、getxxx 之类的函数进行处理而且往往里面就一行代码这时候你可能会想为何不直接将变量改成public暴露出来使用还可以省两个函数几行代码。其实用set get这样处理主要还是为了拓展性比如后期如果需要对赋值进行过滤处理或者该变量只允许读写中的一个如果之前是直接使用的变量外则使用的地方都要去修改规则反而变得很糟糕。比如一些用户设置参数你可以做个类这个类叫做配置类里边只有配置文件的各个项然后再做一个配置控制类里边都是setxxx,getxxx,对配置类进行读写操作。这样设计下来整个配置文件的操作就很规范也很安全 3.快速退出线程 关于如何快速结束线程调用terminate暴力结束容易出问题。一般来说我们都是采用标志位来结束线程但是如果执行过程中的函数很耗时或者在run中msleep休息的时间过久容易导致要很长一段时间才能正确停止此时可以考虑一个策略就是分割线程执行体如果是函数体耗时可以在耗时的函数体中增加停止标志位的判断使其快速跳出如果是延时时间过久可以将延时时间拆分成多个小的时间轮片每个小的休息间隔都判断停止标志位这样也可以极大加快线程正常退出的速度而不用等待太久。
void Thread::run()
{
while (!stopped) {
doTask();
//下面这个延时太久导致退出很慢
//msleep(3000);
//特意每次做个小延时每次都去判断标志位等可以极大加快关闭速度
int count 0;
while (!stopped) {
msleep(100);
count;
//如果到了30次30*1003000毫秒也跳出
if (count 30) {
break;
}
}
}
stopped false;
}
void Thread::doTask()
{
while(1) {
if (stopped) {
return;
}
doTask1();
doTask2();
}
}
4.Qt窗体的Z序叠放 Qt中如果指定了同一个父类窗体则控件都会在该父类窗体中一次覆盖叠放这就需要设置窗口小部件覆盖遮挡与层叠顺序。
for (int i 0; i 1000; i) {
QWidget *w new QWidget(this);
w-setGeometry(0, 0, 100, 100);
w-show();
}
QWidget *w1, *w2, *w3;
//将w1控件移到最前面相当于在该父窗体中置顶
w1-raise();
//将w1控件移到最后面相当于在该父窗体中置底
w1-lower();
//将w1控件移到w2控件下面
w1-stackUnder(w2);
//将w2控件移到w3控件下面
w2-stackUnder(w3);
...5.子窗体的释放 当我们关闭窗体的时候按道理来说都会执行对应窗体的析构函数 ~MainWindow() 之类的这是理想状态当你的窗体还弹出了子窗体就算你关闭了主窗体会发现子窗体依然在而且根本没有去析构主窗体对应的子窗体也没有设置 setParent 通常情况下我们都是希望关闭了主窗体对应子窗体自动关闭这个时候怎么办呢你需要重载 closeEvent 拿到关闭消息主动去把子窗体释放。
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent 0);
~MainWindow();
protected:
void closeEvent(QCloseEvent *);
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QLabel *lab;
};MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui-setupUi(this);
lab new QLabel;
lab-resize(400, 300);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::closeEvent(QCloseEvent *)
{
//先把子窗体释放
lab-deleteLater();
}
void MainWindow::on_pushButton_clicked()
{
lab-show();
}
6.Qt中的事件发送 关于Qt中 sendEvent 和 postEvent 主动模拟发送鼠标键盘事件的几点说明。 sendEvent是阻塞式代码会立即执行支持栈空间和堆空间事件对象的发送局部对象和new分配的对象。 postEvent是非阻塞式会发送到事件队列中等待处理只支持栈堆空间事件对象的发送new分配的对象。 new分配的事件对象被处理后会由Qt内部自动摧毁不用担心。 短时间内密集频繁的调用推荐用postEvent放入事件队列非常安全。否则用sendEvent很容易导致崩溃。
//下面这个会立即执行
QResizeEvent event(size(), size());
QApplication::sendEvent(this, event);
//下面这个会立即执行
QResizeEvent *event new QResizeEvent(size(), size());
QApplication::sendEvent(this, event);
//下面这个不会报错但是也不会执行因为事件对象是局部变量
QResizeEvent event(size(), size());
QApplication::postEvent(this, event);
//下面的方式非常安全
QResizeEvent *event new QResizeEvent(size(), size());
QApplication::postEvent(this, event);7.Qt的全局头文件 如果要使用Qt的东西哪怕是最基础的标识宏定义 Q_OS_WIN 之类的都要保证该前面至少包含了qglobal.h 否则都是失败的这些 #ifdef Q_OS_WIN #ifdef Q_CC_MSVC 之类的都会失效。
//必须要先引入这个头文件
#include qglobal.h
#ifdef Q_OS_WIN
...
#else
...
#endif
#ifdef Q_CC_MSVC
#pragma execution_character_set(utf-8)
#endif