您的位置:首页 > 编程语言 > Qt开发

Qt的一些相关知识

2017-03-08 17:18 337 查看
QString转换成char*

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换

Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型

在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档。

因为char*最后都有一个‘/0’作为结束符,而采用QString::toLatin1()时会在字符串后面加上‘/0’

方法如下:

Qstring  str;

char*  ch;

QByteArray ba = str.toLatin1();  
 

ch=ba.data();

这样就完成了QString向char*的转化。经测试程序运行时不会出现bug

注意第三行,一定要加上,不可以str.toLatin1().data()这样一部完成,可能会出错。

 

补充:以上方法当QString里不含中文时,没有问题,但是QString内含有中文时,转换为char*就是乱码,采用如下方法解决:

方法1:

添加GBK编码支持:

#include

QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

然后改变上面的第三行为:QByteArray ba = str.toLoacl8Bit();
   
 toLoacl8Bit支持中文

方法2:

先将QString转为标准库中的string类型,然后将string转为char*,如下:

std::string str = filename.toStdString();

const char* ch = str.c_str();

---------------------------------------------------------------------------------------------------------------
线程方法必须是静态方法,你如果写在类里,不能是成员函数,需要加static
这意味着你不能在repairFileThread里访问A实例的成员,不过你可以通过参数传递A的实例
A a;
pthread_create(&tid,NULL,A::repairFileThread,a);
.....
void * A::repairFileThread(void *arg)
{
  A* a = (A*)arg;
  a->xxx...
}

Qt中的线程函数

socket编程中的connect函数与Qt的connect函数发生冲突,解决办法:在使用socket的connect函数是用
::connect(···)

---------------------------------------------------------------------------------------------------------------
Qt下点击按钮弹出另一个窗口

使用dialog.exec()函数,或者添加窗口部件堆栈

创建窗口部件对象(Widget类型)
m_stackedWidget = new QStackedWidget();

添加需要切换的窗口部件
m_stackedWidget->addWidget(m_displayWidget);
m_stackedWidget->addWidget(m_setWidget);

设置当前窗口部件
void MainWidget::showVersionWidget()
{
m_stackedWidget->setCurrentWidget(m_versionWidget);
}

---------------------------------------------------------------------------------------------------------------
QT点击按钮后使按钮不能再次被点击

ui->button->setEnable(false);

-----------------------------------------------------------------------------------------------------------------------------------

按钮,常常被理解为触发一种动作请求或者命令,是与用户进行指令交互的操作。Qt中Button系列根据用途被划分为不同的定义,其实现框架为QAbstractButton提供按钮的通用性功能,此为抽象基类,所以无法进行实例化。用户需要继承定义此类,实现paintEvent,实现具体的展示。常见的Button有QPushButton,QToolButton,QRadioButton及QCheckBox。这种根据用户分为标记(toggle)的与非toggle的。此种模式用到的典型的c++一种抽象继承模式,将Button通用的抽象到QAbstractButton类,其余类继承,并根据自己的特点来实现画图展现的功能。为此我们从最基本的开始

 
 1、QAbstractButton:此为按钮的抽象积累,提供按钮通用的功能。此类不能实例化,所以子类处理交互动作,尤其是如何绘制button。其为可按按钮(push
button)和可检查(checkable)或切换(toggle)标记按钮提供支持。标记按钮的实现有QRadioButton单选按钮和QCheckBox多选框。可按俺就实现有QPushButton和QToolButton。他们都可以是标记切换,只要需要。
   
 按钮都能显示一个可以包含文字text和图标icon的标签label,使用setText设置文本,setIcon设置图标。如果Button是个文本按钮,则包含的ampersand(‘&’)符号可以添加快捷键shoarcut
key。
   上述四种实现按钮可同时显示文字和图标。
 
 1.1QAbstractButton可以提供大多数的Button的状态

 
 1)isDown()表示按钮button是否是pressed down按下的
 
 2)isChecked()表示按钮是否被检查或者标记切换的。只有可检查和切换(标记)的按钮可以标记或者取消标记checked
or unchecked

   3)
isEnabled()表示按钮是否可以被用户点按

 
 4)setAutoRepeat()设置按钮是否当用户长按按钮可以auto-repeat(自动重复执行),属性autoRepeatDelay和autoRepeatInterval定义了如何重复响应执行

   5)
setCheckable()设置按钮是否可切换或者标记的

 

   1.2
QAbstractButton提供如下信号

 
 1)pressed(),当鼠标在button上并点击左键的时候发射。

 
 2)released(),当鼠标左键被释放的时候

   3)clicked(bool
checked=false),当鼠标首先按下pressed,然后释放,或者快捷键被触发,或者click()或者animateClick()调用

   4) toggled()
当可切换(标记)按钮状态改变时发射

 

   1.3
QAbstractButton抽象的按钮属性

   1) autoExclusive:bool
 标志自动互斥是否激活enabled。如果是激活的,那么属于同一父窗口的可标记chackabled按钮和他们属于一个互斥按钮组表现一样,只有一个按钮状态是checked标记的。
   注意,此属性对于属于按钮组button
group的按钮。默认是false的,对于radio按钮是true的 www.it165.net

   bool
autoExclusive()及setAutoExclusive(bool)进行访问与设置
 
 2)autoRepeat:bool标志是否重复点按激活的,默认是关的。如果是激活的时候pressed()/released()/clicked()信号会发射,在限定的interval。

  注意:如果按钮被按下是通过快捷键shortcut
key,此属性被激活并且时间是系统定义的,而不是此类定义的,信号正常发射。
 
autoRepeat()和setAutoRepeat(bool)设置是否自动重复按钮
   3) autoRepeatDelay:int
表示自动哦重复的初始延时时间。
  用autoRepeatDelay()和setAutoRepeatDelay(int)设置时间,单位ms级的
   4) autoRepeatInterval :
int表示自动重复的时间间隔,setAutoRepeatInterval(int)进行设置
   5)chekcable:bool
表示button是否可以checkable标记切换,

 
 isCheckable()判断是否可标记,setCheckable(bool)设置
   6)checked:bool
表示是否标记,isChecked()获取是否被标记,setChecked(bool)设置标志状态

 
 注意,此属性必须在checkabled的button才能使用,会触发toggled(bool
checked)信号

   7)down :bool
表示button是否按下。isDown及setDown(bool)进行设置。
   8)icon : QIcon
表示icon是否显示在button按钮上。icon的大小根据GUI类型定义的,但可以通过iconSize属性设置。
     QIcon
icon() : void setIcon(const QIcon &icon)
   9)text : QString
属性保存按钮上显示的问题。

 
 通过text()获取值,如果为空则返回一个空串。如果字符里面包含ampersand‘&’符号,则shortcut自动会创建。如果显示&字符,则使用‘&&’就可以了。

   没有默认字符串,通过setText(const
QString &)设置此值。
   1.4
QAbstractButton抽象类提供的常见函数:
   1)void
QAbstractButton::animateClick ( int msec = 100 )
[slot],按钮会立即被按下pressed,并且msec时间后释放。如果没有释放继续调用此函数,则会重置释放时间。
 
 所有的信号与click会被发射。如果button是disabled,此函数不工作。
   2)void
QAbstractButton::click ()
[slot]执行一次点按操作。所有与点按相关联的信号都会被发射,如果button是checkable,那么按钮的状态会切换toggled。如果按钮为disabled则不工作
   3)void
QAbstractButton::toggle () [slot] 切换按钮的状态,会触发toggled(bool
checked)信号

 
 2、QPushButton,是QAbstractButton的实现体。是一个command按钮,点击其执行一些动作或者响应一些问题,常见场景如ok,apply,cancel
yse no help等。

    命令按钮常用文本表示他的动作。
   按钮最重要的状态是:

   是否可用(disabled or
enabled)
   标准的push button
或者togglebutton 或者menu button

   开启或者关闭(on or
off),仅针对可切换按钮
 
 default还是normal,默认按钮一般会被点击,在一个对话框里使用确定或返回键的时候
   auto-repeat自动重复
   pressed down 是否被按下
 
 另外一个命令按钮的一个变体是菜单按钮。不仅提供一个命令,当其点击时会弹出一个菜单选项。使用setMenu方法可以将此按钮与弹出菜单选项关联

    在一个对话框,按钮可以设置为default
和auto-default按钮。比如当对话框接受焦点的时候其自动获取焦点,可以使用setAutoDefault()设置。
   
需要注意的是auto-default按钮会占用稍微多一点的空间,及比一个正常按钮宽,用于汇话默认按钮的indicator标记,如果不需要则设置setAutoDefault(false)就可以了

    2.1 添加属性:
    1)autoDefault:bool
    此属性保持命令按钮是否自动默认按钮,即auto
default button
   
2)default:标志此命令按钮是一个默认按钮。
    通过bool
isDefault()获取、setDefault(bool)设置此属性

   
default和autoDefault属性决定了当用户在一个对话框按enter时发生的事情
   
如果一个属性被设置了default,则此按钮自动发射pressed信号,除非autoDefault按钮当前获取了焦点,则autoDefault按钮pressed被发射。
   
如果对话框dialog只有autoDefault按钮没有default按钮,则当前获取焦点的autoDefault按钮发射pressed,或者没有获取焦点的按钮,则下一个焦点连的按钮被发射。
 
 一个对话框只有一个按钮是default默认按钮,此按钮需要额外的空间表示。
 
 默认按钮default行为只在对话框使用。获取焦点的按钮总是可以被点击通过键盘的空格键
    3)
flat:bool表示是否显示按钮的border边框
     bool
isFlat()获取,setFlat(bool)进行设置。
 
 默认值为false,如果设置为true,大多数情况,此按钮的背景不会绘画出来,除非按钮被点击。
 
 setAutoFillBackground()可以用于保证背景可以使用QPalette::Button
格式刷绘画出来。
   2.2 常见函数:
   QPushButton::QPushButton
( QWidget * parent = 0 )
   QPushButton::QPushButton
( const QString & text, QWidget * parent = 0 )
   QPushButton::QPushButton
( const QIcon & icon, const QString & text, QWidget *parent
= 0 )
  创建一个命令按钮text用于描述,QIcon用于显示小图标
   QMenu * QPushButton::menu
() const
 
 获取与button关联的弹出菜单,如果没有关联菜单返回0

   void QPushButton::setMenu
( QMenu * menu )
 
 关联一个菜单到按钮上,这样按钮就形成了菜单按钮

 

   void
QPushButton::showMenu () [slot]
 
 显示与button相互关联的按钮,如果没有则什么都不操作。

   此函数知道弹出菜单被关才会返回。

   3、QRadioButton:单选按钮

 
 单选按钮提供一个按钮和一个label,label用于显示对应的文本信息。
 
 单选按钮是一种开关按钮,可以切换为on或者off即checked或者unchecked。主要用途用于提供给用户‘one
of
many’选择。如果用户选择另外一个单选按钮,则之前的就被反选了。默认是autoExclusive的,如果是激活的,属于同一个父类的单选按钮只能选中一个,如果需要多个
exclusive互斥选项在同一个父窗口使用,则将他们方知道QButtonGroup内。
 
 不管切换开关都会发射toggle信号发射。
 
 和QPushButton一样,一串文本显示内容,文本加&会自动创建快捷键
 
 设置文本或icon使用抽象类的接口setText及setIcon实现。

 
 4、QCheckBox:复选框,提供一个checkbox和一个文本label

 
 同QRadioButton,是一个开关按钮,可切换状态on或者off,即checked或者unchecked。
 
一般,此复选框可以enable或者disable但不影响其他复选按钮。但是如果此放置到一个互斥的QButtonGroup里面,则只能选一个复选框。这是有互斥选项的QButtonGroup所限定的属性。
 
 当checkbox复选框是checked标记或者清楚,都会触发stateChangeed信号。可以使用isChecked()去查询复选框按钮是否标记。
 
 除了常用的选中与没选中状态,QCheckBox提供第三种状态即“没有改变”状态。这是很有用的,当你给用户一个既不选择又不反选的复选框。如果使用此状态,设置其属性setTristate(),然后用checkState()去查询当前标记切换的状态。
   4.1 tristate:bool
表示此复选框是否是一个tri-state三态复选框
   bool isTristate()
setTristate(bool)查看及设置
   4.2 常用函数:

   Qt::CheckState
QCheckBox::checkState () const
 
 查看复选框的状态,如果不需要tristatus,直接可以用isChecked,其返回boolean值

   void
QCheckBox::setCheckState ( Qt::CheckStatestate )
 
 设置当前复选框的状态。如果不需要支持tristate,则可以直接用setChecked(bool)

   stateChanged(int
state)信号:当复选框状态改变时。

 
 5、QToolButton:顾名思义,就是工具操作相关的按钮。其是一种快速访问按钮命令或选项。所以通常和QToolBar搭配使用。工具按钮通常不显示文本,而显示图标QIcon。其主要搭配QToolBar上的QAction行为创建和使用的。

 
 一般QToolButton会在QToolBar::addAction时创建,或者已经存在的action添加到QToolBar时创建。当然此按键肯定可以与普通案件一样初始化和使用。

QToolButton支持自动强制显示模式。可以使用setAutoRaise()设置按钮浮动。
 
QToolButton一个经典用法就是可以选择工具,及此按钮有开关之分,比如绘画图里面使用画笔,选择此按钮可以画东西了。
 
 工具按钮图标设置为QIcon,这就可以区分不同的分辨率,在disabled和active活跃状态。如果按钮的功能不可用,则使用非使能disabled像素,激活的pixmap像素在按钮漂浮的时候显示,因为鼠标在上面。
 
 工具按钮外观和特点可以通过设置按钮风格setToolButtonStyle和设置setIconSize修改。
 
 QToolButton另外一个选择是弹出菜单,弹出菜单可以使用setMenu和setPopupMode()配置不同的可用的按钮携带一个菜单集合。弹出列表可以使用setPopupDelay。
    5.1
属性:arrowType,箭头属性,按钮是否显示一个arrow代替正常的icon,默认显示Qt::NoArray
 
 Q::ArrowType指箭头,显示为Qt::NoFocue,
enum Qt::ArrowType
ConstantValue
Qt::NoArrow   0  
Qt::UpArrow   1  
Qt::DownArrow   2  
Qt::LeftArrow   3  
Qt::RightArrow   4  
表示箭头,setArrowType设置对应箭头显示位置
autoRaise悬浮框,是否变迁。
popupMode:描述弹出菜单属性,
toolButtonStyle:表示按钮文本和图片显示位置
 
t::ToolButtonIconOnly   0  
Only display the icon.  
Qt::ToolButtonTextOnly   1  
Only display the text.  
Qt::ToolButtonTextBesideIcon   2
  The text appears beside the icon.
 
Qt::ToolButtonTextUnderIcon   3
  The text appears under the icon.
 
Qt::ToolButtonFollowStyle   4
  Follow the style.  
toolButtonS显示文本和图片
 
t::ToolButtonIconOnly   0  
Only display the icon.  
Qt::ToolButtonTextOnly   1  
Only display the text.  
Qt::ToolButtonTextBesideIcon   2
  The text appears beside the icon.
 
Qt::ToolButtonTextUnderIcon   3
  The text appears under the icon.
 
Qt::ToolButtonFollowStyle  


--------------------------------------------------------------------------------------------------------------------------------------
Qt设置ComboBox下拉子项高度:

 QComboBox *box = new QComboBox();
 box->setStyleSheet("QComboBox
QAbstractItemView::item{height:20px;}");
box->setView(new QListView());

--------------------------------------------------------------------------------------------------------------------------------------

Qt设置PushButton的底色为透明,且button上的文字左对齐显示

button->setStyleSheet("QPushButton{background-color:transparent;text-align:left;}");

设置button上的字体颜色
QPalette pa;
pa.setColor(QPalette::ButtonText,Qt::white);
button.setPalette(pa);

---------------------------------------------------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: