QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行:
方法一:采用对象名称进行获取
代码:
2 QString name = pbtn->objectName();
3 if(!QString::compare(name, "radioButton"))
4 {
5 QMessageBox::information(this, "Tips", "red chosed!", QMessageBox::Ok);
6 }
7 else if(!QString::compare(name, "radioButton_2"))
8 {
9 QMessageBox::information(this, "Tips", "blue chosed!", QMessageBox::Ok);
10 }
11 else
12 {
13 QMessageBox::information(this, "Tips", "black chosed!", QMessageBox::Ok);
14 }
该代码片段中,首先使用qobject_cast将checkedButton()函数返回的QAbstractionButton转换为其子类类型QRadioButton.然后,获取被选中按钮的对象名。这可以通过获取objectName这个属性获取。再稍作判断即可得知结果。注:BG是手动添加的QGroupButton类型,radioButton和radioButton_2,radioButton_3都是UI中添加的radioButton控件。
方法二:通过button的ID来获取
代码:
位于构造函数中的代码(初始选中第一个按钮):
2 ui->BG->setId(ui->radioButton_2, 1);
3 ui->BG->setId(ui->radioButton_3, 2);
4 ui->radioButton->setChecked(true);
响应信号的槽函数或其他函数中的代码:
2 switch(a)
3 {
4 case 0:
5 QMessageBox::information(this, "Tips", "Red chosed!", QMessageBox::Ok);
6 break;
7 case 1:
8 QMessageBox::information(this, "Tips", "blue chosed!", QMessageBox::Ok);
9 break;
10 case 2:
11 QMessageBox::information(this, "Tips", "black chosed!", QMessageBox::Ok);
12 break;
13 default:
14 break;
15 }
两种方法具有同样的效果。
本文链接
先上源码:
2 {
3 //////////////////////////////
4 // 1. super init first
5 if ( !CCLayer::init() )
6 {
7 return false;
8 }
9 int num[20];
10 for (int i=0; i<20; i++) {
11 num[i] = i;
12 }
13
14 for (int i=0; i<20; i++) {
15 int r = random(i, 19);
16 swap(num[i], num[r]);
17 CCLOG("rand:%d", num[i]);
18 }
19
20 return true;
21 }
22
23 int HelloWorld::random(int start, int end){
24 float i = CCRANDOM_0_1()*(end-start+1)+start;
25 return (int)i;
26 }
第24行的语句的意思是获取[start, end]范围的随机数。
第9--12行初始化一个长度为20的数组,初始化的内容是将要被打乱的目标随机数。
第14-18行首先获取一个范围为[i, 19]的随机数r,然后将index为i和index为r的数进行交换,然后输出利用随机数打乱后的数组。
另外,实际使用时不要忘记设置随机数种子,不然的话每次获取的随机数都是相同的
本文链接
关于vtordisp知多少?
我相信不少人看到这篇文章,多半是来自于对标题中“vtordisp”的好奇。其实这个关键词也是来源于我最近查看对象模型的时候偶然发现的。我是一个喜欢深究问题根源的人(有点牛角尖吧),所以当我第一次发现vtordisp的时候,我也是很自然的把它输进google查找相关资料,但是结果令我不太满意。不过,即使如此,我还是把与它相关的资料整理如下,并结合自己的理解和大家分享一下,希望能共同学习进步。
首先从产生“vtordisp”问题的那个例子开始。
{
public:
int base;
virtual void fun(){}
};
class Der:virtual public Base
{
int der;
public:
Der(){}
virtual void fun(){}
};
Der对象模型如下:
1> +---
1> 0 | {vbptr}
1> 4 | der
1> +---
1> 8 | (vtordisp for vbase Base)
1> +--- (virtual base Base)
1> 12 | {vfptr}
1> 16 | base
1> +---
1>
1> Der::$vbtable@:
1> 0 | 0
1> 1 | 12 (Derd(Der+0)Base)
1>
1> Der::$vftable@:
1> | -12
1> 0 | &(vtordisp) Der::fun
1>
1> Der::fun this adjustor: 12
1>
1> vbi: class offset o.vbptr o.vbte fVtorDisp
1> Base 12 0 4 1
我们发现对象的8字节偏移处,使用了4个字节存储了虚基类Base的vtordisp。在我的前一篇博客内,我们并未涉及这个内容。首先,我从查阅一下vtordisp的MSDN的解释