分享

qt 学习笔记(转载)

 昵称19442539 2014-09-18
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的作用域即可

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多