第一个Qt&C++开发项目所遇到的坑

以后该博文将作为UP主日常Qt问题、Bug解决方案的汇报提交基地(手动滑稽)

前言

最近接受了一个利用Qt控件和C++代码联合开发的小项目,功能是实现点击相应的按钮跳转对应的exe或者dll文件,并对任意尺寸的屏幕进行适配。期间遇到了许多小坑,写出来和大家分享一下,maybe以后就用得上了,也算对自己一个总结。

1、中文乱码问题

网上有很多相应的方法,比如说设置utf-8一类的,如果尝试了诸多方法还是不行,可以尝试下面的方法:
在main函数中包含头文件

#include <QTextCodec>

然后再main函数体中加入以下代码:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());

    MyApplication w;
    w.show();
    return a.exec();
}

2、对控件设置setStyleSheet

很多时候我们需要对Label或者是Widget进行背景图设置,方法很多,但是最好用的就是setStyleSheet,代码如下:

QLabel * bottom_car_label_ = new QLabel(this);                      
bottom_car_label_->setStyleSheet("border-image:url(:/Resources/home_image/car.png);background-repeat:no-repeat;background-position: center;background-color:rgb(88,76,141,0);");

1)border-image是对加载的图片进行拉伸。如果你的控件不是对应比例,那么会导致图片失真。
2)url(:/Resources/home_image/car.png)这个是用的qrc文件资源管理器。代表的是当前项目Resources文件夹—>home_image文件夹—>car.png图片
3)下面三个一起说,都是对控件一些属性的设置,repeat代表是重复,详情大家可以参考文档;position代表的是对齐方式,center就是居中,以此类推;最后一个设置颜色,前三个是rgb的整数值,最后一个是透明度。
background-repeat:no-repeat;
background-position: center;
background-color:rgb(88,76,141,0);

值得注意的是,如果要是对QWidget使用了setStyleSheet,那么对于加载在该QWidget的QWidget如果也设置背景图片,会导致背景图片不能显示。
处理的方法就是重写该QWidget的paintEvent方法,并在方法里加入下面的代码既可以避免这样的情况:

void MyApplication::paintEvent(QPaintEvent * event)
{
    //使用setStyleSheet的QWidget要重写他的paintEvent,防止子视图展现不出来
    QStyleOption opt;  
    opt.initFrom(this);  
    QPainter p(this);  
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);  
    QWidget::paintEvent(event);
}

3、最大化最小化窗口方法

不同于MFC,Qt设置窗口最大化和最小化的方法非常简单,代码如下:

//关闭窗口
QPushButton *close_button_ = new QPushButton(this);
    /*
    各种自定义设置
    */

//将按钮的点击事件作为信号发送,并连接QWidget的close()槽函数既可关闭窗口
    connect(close_button_, SIGNAL(clicked()), this, SLOT(close()));


QPushButton*    min_button_ = new QPushButton(this);
/*
    各种自定义设置
    */

//将按钮的点击事件作为信号发送,并连接自己写的showMinimizedClick()槽函数
    connect(min_button_, SIGNAL(clicked()), this, SLOT(showMinimizedClick()));

//showMinimizedClick()槽函数内容如下:
//最小化
void MyApplication::showMinimizedClick()
{
    this->showMinimized(); 
}

4、当前项目打开其他的exe文件或者是dll文件

开发过程中,我们需要进行对exe文件和dll文件进行打开操作,具体的实现步骤如下:
1)需要将项目生成的exe文件和计划打开的文件放置于同一个文件夹下。
2)在需要的类中包含头文件

//打开文件路径头文件
#include <QProcess>

3)在软件中实现以下代码:

QString program = QCoreApplication::applicationDirPath()+tr("/exp7n_Car.dll");

            QProcess *process = new QProcess(this);
            this->hide();

            if ( -2 == process->execute( program, param ) )
            {
                QMessageBox msg( QMessageBox::Warning, QString::fromWCharArray(L"提示"),
                    QString::fromWCharArray(L"无法打开通用软件!")+program, QMessageBox::Ok ); 
                msg.exec();
            }

            this->show();

其中的QCoreApplication::applicationDirPath()获取的就是你生成的exe文件的路径。

总结

虽然坑很多,但是踩过去就是一种成长,希望对看这篇文章的朋友们有一定的帮助吧。


2018-08-10更新

近日在搞Qt和OC混编过程中遇到了2个新出现的问题,分享出来以作总结。也希望对看到文章的人有所帮助。

1、QTCreator构建套件错误的问题

QTCreator在第一次启动时会扫描系统变量,并在系统变量中查找编译器、QT版本、调试器以及Qmake,并将结果保存在配置文件中,并且再次启动时不会重新扫描并更改这些设置。
当编译器等发生变化时,需要将QTCreator的配置文件删除以强制其在启动时重新扫描系统环境,并重新设置构建套件的相关配置。如果重新设置了Qt的编译器内容,QtCreator提示构建套件错误,可以删除这些默认配置重新运行,错误的构建套件就会被移除了。(通过Qt内部貌似不能直接移除默认生成的构建套件)
PS:QTCreator的配置文件存放位置为:C:\Users\%USERNAME%\AppData\Roaming\QtProject。

2、Qt在Xcode升级后,原有代码编译不过的问题解决

起因:iMac在升级系统后,Xcode自动升级为9.4.1最新版本。QtCreator在执行qmake时报错。
问题描述:
error: 'TargetConditionals.h' file not found;"# include <TargetConditionals.h>"
解决方案:
1、打开下列路径/Users/imac/Qt5.8.0/5.8/clang_64/mkspecs。找到目录下的qdevice.pri
2、如果有!host_build:QMAKE_MAC_SDK = macosx这类,请修改为!host_build:QMAKE_MAC_SDK = macosxXX.XX。XX.XX为当前Xcode的MacSDK的版本。
3、MacSDK版本查看方式为:
打开路径/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs,查看SDKs下的版本路径

例如当前系统的版本为11.13,那么步骤2需要修改为:!host_build:QMAKE_MAC_SDK = macosx11.13
然后再执行qmake和编译就没有问题了。

原因:Xcode升级后,Qt5.8原有连接的SDK升级为其他版本的SDK,这就导致了旧的Qt编译的框架在新的Xcode路径中找不到对应的SDK,上述解决方案本质上就是告诉Qt要链接的库发生了修改,找不到就连接指定的SDK。理论上同步更新最新的Qt版本也可以解决问题(未测试。。。)

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值