1.如果在关闭窗口之前判断是否可以关闭窗口
答:重新实现该形式的()函数,添加判断操作
void MainWindow::closeEvent(QCloseEvent *event)
{
if (maybeSave())
{
writeSettings();
event->accept();
}
else
{
event->ignore();
}
}
2、如何用打开和保存文件对话框
答案:使用
QString fileName = QFileDialog::getOpenFileName(this);
if (!fileName.isEmpty())
{
loadFile(fileName);
}
QString fileName = QFileDialog::getSaveFileName(this);
if (fileName.isEmpty())
{
return false;
}
如果你使用qt自己的:
选择文件夹
* = new(this,"请选择文件夹","文件"); //打开目录选择对话框
openFilePath-> setFileMode( QFileDialog:irectoryonly );
if ( openFilePath->exec() == QDialog::Accepted )
{
//code here!
}
delete openFilePath;
选择一个文档:
QFileDialog *openFilePath = new QFileDialog(this);
openFilePath->setWindowTitle(tr("请选择文件"));
openFilePath->setDirectory(".");
openFilePath->setFilter(tr("txt or image(*.jpg *.png *.bmp *.tiff *.jpeg *.txt)"));
if(openFilePath->exec() == QDialog::Accepted)
{
//code here
}
delete openFilePath;
7. 如何使用警告、信息等对话框
答:使用类的静态方法
int ret = QMessageBox::warning(this, tr("Application"),
tr("The document has been modified.\n"
"Do you want to save your changes?"),
QMessageBox::Yes | QMessageBox:efault,
QMessageBox::No,
QMessageBox::Cancel | QMessageBox::Escape);
if (ret == QMessageBox::Yes)
return save();
else if (ret == QMessageBox::Cancel)
return false;
或者简单地:
QMessageBox::information(this, "关于","盲人辅助系统(管理端)!\nVersion:1.0\nNo Copyright");
9. 为什么Qt中没有终端输出?
答:.pro文件中添加以下配置项
win32:ConFIG += console
11、如果我想在源代码中直接使用中文,而不使用tr()函数进行转换,该怎么办?
答:在main函数中添加以下三个语句,但不推荐
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
或者
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
使用GBK还是UTF-8取决于源文件中汉字使用的内码
这样就可以在源文件中直接使用中文了,例如:
QMessageBox::information(NULL, "信息", "关于本软件的演示信息", QMessageBox::Ok, QMessageBox::NoButtons);
12、使用数据库开发的程序发布到其他机器上时,为什么无法连接数据库?
答:这是因为程序找不到数据库插件。 您可以按如下方式解决:
在main函数中添加如下语句:
QApplication::addLibraryPath(strPluginsPath");
这是插件所在的目录。 例如,如果该目录是 //,则所需的 sql 驱动程序将为
将.dll、.dll或对应的.so文件等移入
//// 就在目录下面
这是一个解决方案,也有一个通用的解决方案,就是在可执行文件目录下写入qt.conf文件,将一些系统相关的目录配置写入
qt.conf文件中,详细参考Qt中的qt.conf部分
13、如何创建QT使用的DLL(.so)以及如何使用这个DLL(.so)
答:创建DLL时,其工程使用lib模板
TEMPLATE=lib
源文件和使用普通源文件一样,注意头文件和源文件分开,因为其他程序使用这个DLL时需要这个头文件
使用该DLL时,在工程源文件中导入DLL头文件,并在.pro文件中添加如下配置项:
LIBS += -Lyourdlllibpath -lyourdlllibname
Linux下也是一样(Linux下生成的DLL文件名是.dll,Linux下生成的是.so。注意DLL程序的编写方法遵循各个平台级别的编译器设定的规则。
14. 如何启动外部程序
回答:
1、使用::()方法启动外部程序后立即返回;
2、使用::(),但是使用该方法时,程序会阻塞,直到该方法执行的程序结束后返回。 这时可以使用这两个类结合的方法来防止在主线程中调用造成的阻塞
首先继承一个类,重新实现run()函数:
class MyThread : public QThread
{
public:
void run();
};
void MyThread::run()
{
QProcess::execute("notepad.exe");
}
这样,就可以在使用的时候定义一个类型的成员变量,并在使用的时候调用它的start()方法:
class ...............
{...........
MyThread thread;
............
};
.....................
thread.start();
19. 如何制作不规则形状的形状或组件
答:请参考下面的帖子
20、删除数据库时出现“::: 'xxxx' is still in use, all will stop work”如何处理
答:出现这种错误是因为连接名为xxxx的变量的作用域尚未结束。 解决办法是在所有使用xxxx连接的数据库组件变量的作用域结束后,使用::("xxxx")删除该连接。
21、如何显示图片并使其与表单同步缩放
答:下面是一个派生类,设置其背景为图片,可以随着表单的变化而变化。 事实上,从下面的代码中还可以衍生出很多其他的方法。 如果需要,可以从该类派生出其他类来使用。
头文件:.hpp
#ifndef IMAGEWIDGET_HPP
#define IMAGEWIDGET_HPP
#include
#include
class ImageWidget : public QWidget
{
Q_OBJECT
public:
ImageWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);
virtual ~ImageWidget();
protected:
void resizeEvent(QResizeEvent *event);
private:
QImage _image;
};
#endif
CPP 文件:.cpp
#include "ImageWidget.hpp"
ImageWidget::ImageWidget(QWidget *parent, Qt::WindowFlags f)
: QWidget(parent, f)
{
_image.load("image/image_background");
setAutoFillBackground(true); // 这个属性一定要设置
QPalette pal(palette());
pal.setBrush(QPalette::Window,
QBrush(_image.scaled(size(), Qt::IgnoreAspectRatio,
Qt::SmoothTransformation)));
setPalette(pal);
}
ImageWidget::~ImageWidget()
{
}
// 随着窗体变化而设置背景
void ImageWidget::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event);
QPalette pal(palette());
pal.setBrush(QPalette::Window,
QBrush(_image.scaled(event->size(), Qt::IgnoreAspectRatio,
Qt::SmoothTransformation)));
setPalette(pal);
}
22、如何读取串口信息
答:可以通过读取qt4.1.0的注册表来读取注册表来获取串口信息!
23.背景修改
QString filename = "E:\图片\壁纸\1.jpg";
QPixmap pixmap(filename);
pal.setBrush(QPalette::Window,QBrush(pixmap));
setPalette(pal);
24.加载指定类型的文件
openFileName = QFileDialog::getOpenFileName(this,tr("Open Image"), "/home/picture", tr("Image Files (*.png *.tif *.jpg *.bmp)"));
if (!openFileName.isEmpty())
{
Ui_Project_UiClass::statusBar->showMessage("当前打开的文件:" + openFileName);
label_2->setPixmap(QPixmap(openFileName));
}
25.QText乱码问题
发布到其他机器上后,汉字全是乱码。 而且我都试过了,都是乱码。
main.cpp中的设置如下:
QTextCodec *codec = QTextCodec::codecForName("System");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
把 gb2312改成System就可以了
#include
26. 图像问题
可以加载带标签的图片,方法:
label->(("路径(可以通过函数获取)"));
但这样的标签没有滚动条,非常不灵活。 可以这样处理:
中创建一个控件,设置一些属性,然后在代码中新建一个标签指针,在cpp构造函数中用new(this)初始化(必须有this,否则后面会出错)。 在那之后:
scrollArea->setWidget(label_2);
scrollArea->show();
27. 布局
最后,要填充窗口,请单击窗口最外面的空白区域。然后单击级别
28. 程序图标
准备一个ICO图标,将这个图标复制到程序主目录中,命名为“.ico”。 然后编写一个icon.rc文件。 里面只有一行文字:
图标“.ico”
最后,在项目的pro文件中添加一行:
= 图标.rc
经过qmake和make之后,你可以发现你的应用程序有了一个漂亮的图标。
29. 输入输出
QT中操作文件,将文件流中的回车输出到txt的方法是定义一个int成员变量,在创建菜单项中写入:
displayGeometryMode=new QPopupMenu(this); //这里创建弹出菜单组displayGeometryMode
m_menuIDWire=displayGeometryMode-> insertItem("Wire",this,SLOT(slt_Change2WireMode()));.//创建弹出菜单子项
displayGeometryMode->setItemChecked(m_ menuIDWire,true);//设定此子项为选择状态
2> 再在槽函数中写:
displayGeometryMode->setItemChecked(m_menuIDWire,false);// 这里设定此子项为非选择状态
64、拦截程序即将退出的信号。
有时候我们需要在程序即将退出时做一些处理,比如保存文件等,如何拦截程序退出的信号呢? 或者使用class()信号,程序可以这样写:
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(Slot_SaveActions()));
在 槽函数Slot_SaveActions()就可以进行相关处理了,注意,使用全局对象qApp需要加载头文件(#include ).
65. 弹出一个标准文件对话框。
程序中弹出文件对话框的处理非常容易,例如如下:
QString filter="Txt files(*.txt)\n" //设置文件过滤,缺省显示文本文件
"All files(*)" ; //可选择显示所有文件
QString Filepathname=QFileDialog::getOpenFileName(" ",filter,this);//弹出对话框,这句需要加载头文件(#include < qfiledialog.h >)
66. 将当前日期时间转换为标准日期时间。
QDateTime currentdatetime =QDateTime::currentDateTime();//需要加载头文件(#include < qdatetime.h >)
QString strDateTime=currentdatetime.toString();
67.设置计时器
所有的子类在设置定时器的时候都不需要加载一个对象,因为这样会造成资源的浪费,并且需要编写多余的函数,非常不方便。 最好的办法就是重载函数,具体写法如下:
class Gui_DlgViewCtrlDatum : public QDialog
{
Q_OBJECT
public:
Gui_DlgViewCtrlDatum( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
~Gui_DlgViewCtrlDatum();
protected:
void timerEvent( QTimerEvent * );
};
void Gui_DlgViewCtrlDatum::timerEvent( QTimerEvent *e )
{
//statements
}
然后在构造函数中设置时间间隔:
(50);//单位是毫秒
这样,每隔50毫秒,该函数就会被调用一次。
68.最方便的几何布局类
QT的几何布局类中,笔者认为使用起来最为方便,如下:
QGridLayout* layout=new QGridLayout(this,10,10);//创建一个10*10的QgridLayout实例
layout->addMultiCellWidget(gui_dlgslab_glwnd,1,8,0,7);// 将OpenGL窗口固定在QgridLayout中的(1,0)单元格到(8,7)单元格中
layout->addMultiCellWidget(Slider1,0,9,8,8);// 将一个slider固定在单元格(0,8)到(9,8)中
layout->addWidget(UpLimitLbl,1,9);//将一 个label(UpLimitLbl)固定在单元格(1,9)中
这样,无论窗体大小如何改变,它们的布局方式都不会发生改变,这比反复使用 QvboxLayout和QhboxLayout要方便快捷许多.
注意:使用几何布局类需要调用头文件(#)
69.字符串类和字符串列表类。
Qstring是 Qt中标准字符串类,下面列出它的一些常用函数:
toInt():将字符串转化成int类型.
ToFloat():将字符串转化成 float类型.
ToDouble():将字符串转化成double类型.
Left(n):从左起取n个字符
Right(n): 从右起取n个字符
SetNum(n):将实数n(包括int,float,double等)转化为Qsting型.
是一个大家很少使用的类。 可以看成是一个链表(QT中的标准链表类Qlist的功能对其适用,其单个节点是类型),特别适合处理文本。 下面的代码可以看出,方便快捷:
Qstring strtmp=”abc|b|c|d”;
QstringList strlsttmp;
Strlsttmp =QStringList::split("|", strtmp);
For(unsigned int I=0;I< Strlsttmp.count();I++)
{
cout<< Strlsttmp.at(I);
}
结果输出为:abc bcd,也就是说通过函数split,一行文本被符号“|”自动分割成单个字符串。 这在文本处理中尤其省力。 (请参考《C语言百科全书》第四版中用“”函数分割文本的例程,并比较两侧)
70. 如何给类添加鼠标支持。
向类添加鼠标支持需要重写以下函数:
void mousePressEvent(QMouseEvent*);
void mouseMoveEvent(QMouseEvent*);
void mouseReleaseEvent(QMouseEvent*);
请看一个例子:
class Gui_WgtMain_GLWnd : public QGLWidget {
Q_OBJECT
public:
Gui_WgtMain_GLWnd(QWidget *parent=0, const char *name=0);
~Gui_WgtMain_GLWnd();
protected:
void initializeGL();
void paintGL();
void resizeGL( int w, int h );
void mousePressEvent(QMouseEvent*);
void mouseMoveEvent(QMouseEvent*);
void mouseReleaseEvent(QMouseEvent*);
private:
int m_nCnt;
};
void Gui_WgtMain_GLWnd::mousePressEvent(QMouseEvent* e)
{
//statements
}
void Gui_WgtMain_GLWnd:: mouseMoveEvent (QMouseEvent* e)
{
//statements
}
void Gui_WgtMain_GLWnd:: mouseReleaseEvent (QMouseEvent* e)
{
//statements
}
其中,e->x();e->y(); e->()可以获取鼠标的位置,e->()可以获取鼠标按键的状态(左、中、右键,ctrl,alt,shift等组合键),可以灵活运用,用鼠标操作屏幕。
71.从ui文件生成.h和.cpp文件
生成.cpp文件
$uic myform.ui -i myform.h -o myform.cpp
生成.h文件
$uic myform.ui -o myform.h
【获取QT开发教程学习资料,点击下方链接领取费用↓↓,首码直播不迷路~】
点击这里:“链接”