qt 学习笔记 问题1:样式表的继承作用域,因为子窗体自动继承父窗体的样式表,所以当需要限制父窗体的样式表作用域时, 解决方式:在change stylesheet中添加如下代码: #login { background-image: url(:/file/image/back.png); } #login * { backpround-image:url(); } 注:login是父窗体的窗体,可以根据实际进行修改 问题二:更新ui文件 解决方式: 当修改了原工程文件中的UI文件后,但是运行后没有显示,可以使用uic命令更新UI文件,具体命令操作如下: uic *.ui -o ui_*.h uic命令在Qt Creator安装目录的qt/bin目录下。 其中*指代具体的文件名 如果此时还不行的话,再尝试关闭Qt Creator然后在打开。 注:在设置基类的时候尽量选择Widget 问题三:隐藏标题栏 解决方式: 去掉界面最上面的带有最大化、最小化、关闭标志的标题栏方法。在*.cpp的构造函数中添加: setWindowFlags(Qt::FramelessWindowHint); 然后重新编译即可。 问题四:找不到QtNetwork文件(或QSql*文件、xml文件等模块文件) 解决方式: 本来存在的文件如QtNetwork等需要增加的模块但是找不到的话,只需要在工程文件中添加 QT += network(可以换成其他模块的文件) 2012-03-09(2个) 问题一:LineEdit中追加显示输入数据 解决方式: 方式一:声明一个QString s对象,然后让s指代LineEdit中的文本,档输入的时候使用+=运算符。假如输入1,表现形式为:s += '1'; 然后让LineEdit中显示s即可. 方式二:使用如下代码QString s; lineEdit->setText(s.append(添加内容)); 问题二:在Label中动态显示时钟 解决方式: 增添一个定时器类,设置定时时间为1秒。档定时时间到时后,设置定时时间为1000毫秒(即1秒),然后使timeout信号连接槽函数,在槽函数中设置显示系统当前时间。 2012-03-12(2个) 问题一:LineEdit中不显示输入的最后一个字符,即回显 解决方式:使用如下代码 s = LineEdit->text(); ui->LineEdit->setText(s.(left(s.size() - 1))); 问题二:无法正常显示中文 解决方式: 尝试在main函数中添加如下代码: QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf_8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); 其中,codecForName中可供选项有:utf-8、gb2312、gb18030、gtk;以前两种为主。(仅限于正常显示中文,不限其他语言) 注:要添加头文件#include <QTextCodec> 使用该种方式可以使程序支持中文,不会出现中文乱码问题 2012-03-13 问题一:输出QString的内容 解决方式:使用qDebug() << QString即可在Application OUT窗口输出QString的内容 问题二:当某个界面操作时间超过一定时间后,自动返回主机面 解决方式: 在构造函数中启动一个定时器,连接timeout()信号,在槽函数中设置发送返回主界面的信号,在manager中进行连接即可。 2012-03-14 问题一:界面参数传递 解决方式: 方式一:在需要发送数据的界面中定义一个信号,该信号含有QString参数,然后在接收界面中定义的槽中也添加参数,使用connect连接这个信号和槽,这样参数就可以从发送方传递到接收方了。 方式二:在头文件中定义一个被调用类的对象,然后在需要调用的位置使用类名.成员名(成员名必须存在) 问题二:编译时产生警告:“control reaches end of non-void function” 解决方式: 是Main函数中没的返回值导致的,在所指示的函数最后加一句return 0或(return (int)value)即可。 2012-03-16 问题一:将从数据库中找到的符合条件的记录放入TableView中。并且设置为可读信息 解决方式: 使用QSqlTableModel中的成员函数setFileter(const string fileter),将查询条件即sql语句中where后面的部分当作const string filter即可. 设置可读使用成员函数setEditTriggers(QAbstractItemView::NoEditTriggers); 以上两个成员函数都要在select()之前使用。 问题二:在Qt中实现播放视频 解决方式: 使用Qt中的phonon库,实现播放视频。最简单的步骤如下: 安装phonon-backend-gstreamer和phonon-devel,然后在工程文件.pro中添加 “QT += phonon”。再需要实现播放功能的函数中添加: Phonon::VideoPlayer *player = new Phonon::VideoPlayer(Phonon::VideoCategory, widget);//widget可以替换为其他需要显示视频的部件 player->load(Phonon::MediaSource("/root/test1.flv")); player->play(); 如果出现如下警告信息:WARNING: Phonon needs QCoreApplication::applicationName to be set to export audio output names through the DBUS interface 则说明没有给application命名,只要在QApplication a(argc,argv)下加入a.setApplicationName("Name");即可。(仅限于在main函数中显示视频时使用。) 注:因为在安装QT的时候默认设置是不安装phonon,所以在开始编译的时候会提示找不到phonon库,(或提示没有phonon这个头文件)。此时只需要重新装上phonon库即可。方法如下: 在终端中输入:apt-get install libphonon-dev,或是在新力得软件中心安装gstreamer等动态库即可。 2012-03-19 问题一:在一个界面中调用另一个界面中的内容//出现段错误,尚未解决 解决方式: 基于C++的原理,在调用界面中声明一个包含被调用部件的类,然后使用类名.调用部件或者是类名->调用部件(指针和非指针的区别)即可实现调用 问题二:在ubuntu中打开rar文件 解决方式: 安装ark库(即Ark压缩归档工具),安装完成后,在打开文件的时候使用Ark文件打开即可。 2012-03-21 问题一:出现如下错误信息: QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work. 解决方式: 方法一:(按照手册提示) 在增加数据库驱动的下面一行添加:QSqlDatabase::database("sales"); 在最后增加: QSqlDatabase::removeDatabase("sales"); 方式二: 在main函数中实现打开数据库的操作,然后在其他界面中直接调用即可 问题二:不使用信号和槽的方式,解决界面之间的信息传递(A界面中的内容向B界面传递) 解决方式: 在A界面中声明一个QString的变量,让这个变量指向需要传递的内容,然后在B界面的头文件中声明一个A界面的类(需要包含A界面的.h文件),如A a;然后就可以在B界面中通过 a.string来调用界面A的信息 2012-03-26 问题一:socket通信中发送和接收数据 解决方式: 发送时使用如下代码: QTcpSocket *socket = new QTcpSocket(this); QByteArray block; //组织需要发送的字符串 socket->write(block);//写入数据 接收时使用如下代码: QByteArray block; block = socket->read(字节数);//读取数据 QString string = QString(block);//转换为QString格式 问题二:在QByteArray中显示中文 解决方式:使用如下代码: QTextCodec *tc = QTextCodec::codecForName("GBK"); QString string1 = tc->toUnicode(block); 如此后在string1中就可以显示了。 2012-03-27 问题一:在sql语句中使用变量 解决方式: 通过使用变量绑定的方式解决。如下代码所示: query.prepare("insert into stu(id, name) values(:id, :name)"); query.bindValue(":id", 7, QSql::In); query.bindValue(":name", s2, QSql::In); 2012-03-28 问题一: 关于Qt::CaseSensitivity和Qt::CaseInsensitivity 解决方式: 二者表示是否区分大小写。前者区分大小写,后者不去分大小写。使用方式是在其后面加上“ cs”,即Qt::CaseSensitivity cs或Qt::CaseInsensitivity cs 问题二:在tableView中显示数据库中的数据 解决方式: 使用如下代码 QSqlTableModel *model = new QSqlTableModel; model->setTable("tablename"); model->select(); tableView->setModel(model); 如果不需要某些项目的话,使用model->removeColumn(需要删除的列的编号);(列的编号是以model->select()后出现的项目顺序进行排序,从0开始); 2012-03-29 问题一:int类型数据和QString类型的转换(将QString类型变量转换为int类型变量,进行完数学运算后,在将int类型变量转换为QString类型) 解决方式: 使用QString中的number成员函数,函数原型为:QString QString::number ( int n, int base = 10 )。具体实例如下: QString::number(Degree_Purchase_Total.toInt(0, 10) + 100, 10) 2012-04-05 问题一:在qt中调用动态库(.so文件) 解决方式:使用QLibrary库,示例代码如下: QLibrary lib(动态库名);//选择加载的动态库 typedef int (*fun)(参数列表);//声明函数指针,该参数列表主要依照被调用的函数确定 fun a = (fun)lib.resolve("调用的动态库的函数名");//不需要参数 if (a) { a(参数列表);//函数执行 } 注:动态库名只能存在于/usr/lib等系统路径下,所以要将使用的动态库放入/usr/lib或/lib中。或设置LD_LIBRARY_PATH变量 2012-04-09 问题一:处理大量的按钮输入时,如数字键盘等。 解决方式: 使用QButtionGroup,实例代码如下: QButtonGroup *buGroup = new QButtonGroup(this);//按钮组 buGroup->addButton(ui->One_2,1);//添加按钮到QButtonGroup buGroup->addButton(ui->Two_2, 2); buGroup->addButton(ui->Three_2, 3); Object::connect(buGroup, SIGNAL(buttonClicked(int)),this, SLOT(buttonNumslot(int))); 槽函数buttonNumslot(int num)的实现、: ui->lineEdit->insert(QString::number(num)); 问题二:按钮实现在两个lineEdit中输入数据 解决方式: 设置setFocus,首先取消按钮的Focus,即: button->setFocusPolicy(Qt::NoFocus);//设置【清空】按钮无焦点 然后在上个的buttonNumslots中添加如下代码: if(ui->worknum->hasFocus())//输入框1焦点 { ui->worknum->insert(QString::number(num)); } else if(ui->passwd->hasFocus())//输入框2焦点 { ui->passwd->insert(QString::number(num)); } 注:对于星号和米字符需要额外实现,大体思路相同 2012-04-10 问题一:unsigned char *转换为QString (灵活使用强制类型转换) 解决方式: 现将unsigned char *转换为char *,然后在强制转换为QString,参考代码如下: unsigned char a[] = "123"; QString string((char *)a); 2012-04-12 问题一:TableWidget显示的项目平均分配列所占用的长度 解决方式:使用如下代码: QTableWidget *table = new QTableWidget(); table->setColumnCount(3); table->setRowCount(5); table->horizontalHeader()->setStretchLastSection(true); //就是这个地方 table->horizontalHeader()->setResizeMode(QHeaderView::Stretch); table->show(); 此种方式只能平均分配当前table的大小,但是不能随着table中数据的大小而改变,如果需要的话,应该使用: tableView->resizeColumnsToContents();//按照内容设置列的宽度 问题二:改变tableWidget中分页的名称 解决方式: 使用tabWidget中的setTabText成员函数,函数原型为:void QTabWidget::setTabText ( int index, const QString & label ) 参考代码如下:tabWidget->setTabText(0, "button"); 问题三:在Qt中使用全局变量,即在各个界面中都能使用 解决方式:使用extern变量类型修饰符 在一个.h的头文件中声明需要全局使用的变量,在变量前面要加上extern修饰符此谓之声明,然后在.cpp文件中给这些变量赋值。此谓之定义。在其他 文件中只需要在所有函数外边使用:变量类型 变量名 ,然后就可使用,在第二次使用时要在前面加上extern。不然编译器会报错:重复定义某个变量 此问题主要是extern的使用方法:先在一个文件中声明(即extern 变量类型 变量名,但不分配内存),然后再定义方可使用(定义方式:变量类型 变量名)。 注:(1)、尽量不要去修改全局变量的值,只是去使用。即将全局变量当作只读变量。防止出现不必要的麻烦。 (2)、调用全局变量的源文件可以不用包含全局变量所在的头文件,但最好是加上,因为几个文件间的相互包含makefile都给解决了。 (3)、这种方法有弊端,主要是如果在系统库函数中有和定义的全局变量同名的变量,将会造成冲突。并且其结构不符合面向对象的思想, 2012-04-13 问题一:在QString中使用arg()成员函数 解决方式: QString s = QString("%1 %2...").arg("").arg("")....;arg中的内容自动和%1、%2按照顺序对应。在一个QString中,arg函数最多可以出现9次,因为arg函数原型如下: QString QString::arg ( const QString & a1, const QString & a2, const QString & a3, const QString & a4, const QString & a5, const QString & a6, const QString & a7, const QString & a8, const QString & a9 ) const 2012-04-17 问题一:在编译时出现此种错误:incomplete type 'QTextCodec' used in nested name specifier 解决方式:没有包含QTextCodec头文件。加上即可。 2012-04-20 问题一:取出tableView中特定行的值 解决方式: 首先创建槽关联信号clicked ( const QModelIndex & )的槽,在槽函数中使用如下代码: int row = index.row();(index是QModelIndex *index,在槽函数声明的时候中自动添加的) qDebug() << QString::number(row, 10); //测试选中第几行 QSqlRecord record = model->record(row); //声明一个QSqlRecord对象,存储查询结果 QString title = record.value("Data").toString(); //将选取的值存储在变量中 qDebug() << title; 2012-04-24 问题一:关于事件重构 解决方式: 首先在头文件中重新定义需要重构的事件,但一定要定义为protect类型,(保持原有类型不变),如 protect : void showEvent(QShowEvent *e); bool event(Qevent *e); 然后在源文件中重新实现该事件即可。 2012-04-25 问题一:获取本机网络信息 解决方式:QNetworkInterface类提供了程序所运行时的主机的IP地址和网络接口信息的列表。在每一个网络接口信息中都包含了0个或多个 IP地址,而每一个IP地址又包含了和它相关的子网掩码和广播地址,它们三者被封装在一个QNetworkAddressEntry对象中。网络接口信息 中也提供了硬件地址信息。而QHostInfo类的作用:通过主机名来查找IP地址,或者通过IP地址来反向查找主机名。 参考如下代码: QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();//获取所有网络接口的列表 foreach(QNetworkInterface interface,list)//遍历每一个网络接口 { if(interface.name()=="eth0")//我的端口是eth0,你的需要根据实际使用端口来进行判断来判断 { qDebug() << "Device: "<<interface.name();//设备名 QString MAC = interface.hardwareAddress();//硬件地址 QList<QNetworkAddressEntry> entryList = interface.addressEntries();//获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址 foreach(QNetworkAddressEntry entry,entryList)//遍历每一个IP地址条目 { if( entry.ip().toString().size() < 16)//区分IPV6和IPV4 { qDebug()<<"IP Address: "<<entry.ip().toString();//IP地址 qDebug()<<"Netmask: " <<entry.netmask().toString();//子网掩码 qDebug()<<"Broadcast: "<<entry.broadcast().toString();//广播地址 } } } } 2012-04-26 问题一:QString类中的一些函数介绍,replace()、remove() 解决方式: replace()函数的作用是使用一个字符串来代替另一个字符串中的某一部分。如: QString str = "a cloudy day"; str.replace(2, 6, "sunny"); //结果为a sunny day 重载的replace()函数让第二个参数代替所有出现第一个参数的地方。如: str.replace("a", "aaaaaaaa");//用“aaaaaaaa”替换所有出现“a”的地方。 remove()函数的作用是删除一个字符串中的某些部分。如: QString str = "a cloudy day"; str.remove(2, 6); //结果为a day 从const char *转换为QString的方式为:QString str += "(const char *)";或是使用加上QString的强制转换,或者调用fromAscii()或fromLatin1()。 问题二:QFile经常使用的成员函数, 解决方式: 构造函数QFile(文件名),open(打开方式,常用有QIODevice::ReadWrite | QIODevice::Text),判断是否到文件末尾atEnd(), 读取一行数据readline() 2012-05-02 问题一:qPrintable使用方法 解决方式:官方网站的帮助手册上的内容如下: 函数原型:const char * qPrintable ( const QString & str ) 内容详解:Returns str as a const char *. This is equivalent to str.toLocal8Bit().constData().//返回const char * 类型的str。等同于使用 str.tiLocal8Bit().constData(). The char pointer will be invalid after the statement in which qPrintable() is used. This is because the array returned by toLocal8Bit() will fall out of scope. //字符指针将在使用了qPrintable()后失效,这是因为通过toLocal8Bit()返回的数组会超出范围。 实例: qWarning("%s: %s", qPrintable(key), qPrintable(value)); 有关系的函数:qDebug(), qWarning(), qCritical(), and qFatal(). 问题二:在qt中执行shell程序或是其他外部程序 解决方式:使用Linux C函数system或QProcesse::execute(),或使用QProcess中的成员函数,一定要把路径写对。不然的话无法执行 参考代码如下: //system("/bin/ls /");//使用system函数, //QProcess::execute("/bin/ls /");//使用QProcess::execute() QProcess *pro = new QProcess;//使用QProcess中的成员函数start pro->start("/bin/ls / > hh.txt"); 2012-05-03 问题一:使用XML的基本知识,XML文件的增删改查功能 解决方式: 在操作XML文件时,经常使用的类还有:QDomNode, QDomDocument, QDomElement和QDomText。官方手册示例代码如下: QFile file("mydocument.xml"); if (!file.open(QIODevice::ReadOnly)) return; if (!doc.setContent(&file)) { file.close(); return; } file.close(); // print out the element names of all elements that are direct children // of the outermost element. QDomElement docElem = doc.documentElement(); QDomNode n = docElem.firstChild(); while(!n.isNull()) { QDomElement e = n.toElement(); // try to convert the node to an element. if(!e.isNull()) { cout << qPrintable(e.tagName()) << endl; // the node really is an element. } n = n.nextSibling(); } 1、增加节点功能:创建文档数据的函数包括createElement()、createTextNode() createComment() createCDATASection() createProcessingInstruction() createAttribute()和createEntityReference(). 2、从XML节点中读取信息 首先以只读方式打开xml文件,然后声明QDomDocument类的一个对象(如doc),使用成员函数setContent()将xml文件导入 doc中。导入成功后,即可关闭文件。声明QDomNodeList类list,使其等于 doc.elementsByTagName(tagname); 此为寻找根节点,然后使用for循环,遍历该节点(for (int i = 0; i < list.count(); i++))。在for循环中声明QDomElement类的对象Node,使Node等于list中的各个字节点。再次声明类QDomNodeList类 的对象NodeList,使NodeList等于Node的子节点。然后就可以使用at(index)将NodeList的index节点赋值给其他变 量。具体情况看其到底有多少个父子节点确定使用多少次该循环(除去寻找根节点以外)。 2012-05-04 问题一:改变LineEdit中字体的大小 解决方式: (方式1)、整体界面字体设置方法:在main函数中添加如下代码: QFont font = app .font(); font.setPointSize(16); app.setFont(font); (方式2)、在Qt/embedded中显示中文,可以采用如下运行方式:./wireless -qws -font unifont (方式3)、改变Qt中QLineEdit中显示内容的大小: QLineEdit *lineEdit = new QLineEdit(); lineEdit->setStyleSheet("font-size : 16px"); 也可以在主函数中添加语句: qApp->setStyleSheet("QLineEdit { font: 16px; }); 2012-05-05 问题一:模拟在文件操作中打开按钮然后显示路径 解决方式: 主要使用QFileDialog中的getOpenFileName()函数,函数原型是: QString QFileDialog::getOpenFileName ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0 ) 。然后使用类QDir中的toNativeSepearators()函数获取路径。该函数原型是: QString QDir::toNativeSeparators ( const QString & pathName ) ; 实例代码如下: QString FilePath = ui->lineEdit->text(); if (FilePath.isEmpty()) FilePath = QDir::homePath(); QString file = QFileDialog::getOpenFileName(0, tr("choose file"), FilePath); file = QDir::toNativeSeparators(file); if (!file.isEmpty()) ui->lineEdit->setText(file); 2012-05-07 问题一:彻底解决连接SqLite的移除默认连接的问题 解决方式: 在主函数中打开数据库,然后在其他的类中对数据库的表进行操作,然后在析构函数中对断开链接,关闭数据库 2012-05-09 问题一:数据库的错误类型 解决方式:数据库的错误类型主要包含在QSqlError类。使用此类的各个模式中的lastError()成员函数就可以获得错误类型。常见的错误类型使用QSqlErrorErrorType枚举类型: 具体内容如下所示: Constant Value Description QSqlError::NoError 0 No error occurred.(正常,没有错误发生) QSqlError::ConnectionError 1 Connection error.(连接错误) QSqlError::StatementError 2 SQL statement syntax error.(sql语句语法错误) QSqlError::TransactionError 3 Transaction failed error.(转换错误) QSqlError::UnknownError 4 Unknown error.(未知错误) 问题二:QGroupBox设置边框 解决方式:用样式表来设置边框 选择 change stylesheet,输入 QGroupBox { border-width:1px; //线的粗细 border-style:solid; border-color:lightGray; //颜色, margin-top: 0.5ex; //文字在方框中位置的偏离度 } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; left:25px; //线的偏离度 margin-left: 0px; padding:0 1px; //文字在方框中位置的偏离度 } 在程序中测试时未通过,(第一次测试时) 2012-05-16 问题一:设置TableView的高亮显示 解决方式: 添加如下代码: ui->Single_View->setSelectionBehavior(QAbstractItemView::SelectRows); 2012-05-23 问题一:清空QTableView中的内容 解决方式: 重新定义一个model(TableModel、QSqlQueryModel等任何模型均可),然后使用TableView中的setModel成员函数重新加载即可 问题二:设置SQLite表中的某一个字段为自增字段 解决方式: 从 SQLite 的 2.3.4 版本开始,如果你将一个表中的一个字段声明为 INTEGER PRIMARY KEY, 那么无论你何时向该表的该字段插入一个 NULL 值,这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数;如果表为空,那么将被更换为 1。 注:在插入的时候不用插入该字段。 2012-05-28 问题一:在使用线程结束时出现如下错误:QThread: Destroyed while thread is still running 解决方式:在调用线程的类的析构函数中添加thread->exit();意思是退出线程,不要使用wait(),因为当使用wait函数后,程序一直在等待主线程的退出 2012-05-29 问题一:在使用图形界面方式裁剪配置内核文件时(即使用make menuconfig命令),出现如下错误:Unable to find the ncurses libraries or the required header files. *** 'make menuconfig' requires the ncurses libraries. 解决方式:安装ncurses库,支持图形界面的内核配置方式。apt-get install libncurses5-dev 或者下载安装包,解压后使用make install命令安装 2012-06-04 问题一:mplayer重复播放 解决方式: mplayer -loop 0,(无限循环,0是循环次数!) 命令行添加,如果是GUI,添加至播放参数! 2012-06-11 问题一:出现错误信息:name lookup of ‘i’ changed for ISO ‘for’ scoping 解决方式: 此种错误的出现是由于在程序中使用局部变量i所置。即在i的作用域之外使用了变量i,只要扩大i的作用域即可 |
|
来自: 昵称19442539 > 《qt》