• 12368阅读
  • 10回复

Qt4是否支持按钮数组 [复制链接]

上一主题 下一主题
离线newdc
 

只看楼主 倒序阅读 楼主  发表于: 2008-09-24
— 本帖被 XChinux 执行加亮操作(2008-09-24) —
Qt4是否支持按钮数组
离线sbtree
只看该作者 1楼 发表于: 2008-09-24
看你好像是vb背景的
windows 7 + VC++2008 + Qt4.5.2
离线XChinux

只看该作者 2楼 发表于: 2008-09-24
支持。
至于怎么用,看C++.
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线newdc

只看该作者 3楼 发表于: 2008-09-24
引用第2楼XChinux于2008-09-24 18:10发表的  :
支持。
至于怎么用,看C++.

该怎么做呀,我现在用的是6x5的按钮矩阵,不用数组估计会有我好看的。
离线newdc

只看该作者 4楼 发表于: 2008-09-24
引用第1楼sbtree于2008-09-24 17:02发表的  :
看你好像是vb背景的

知道一些vb的皮毛,主要做C51。
离线破烂石头
只看该作者 5楼 发表于: 2008-09-24
如果只需要响应一些简单的鼠标/键盘事件的话,不需要弄一个控件数组
用一个合适的控件,然后在上面贴图,判断鼠标点击的范围,用更新贴图的方式模拟按钮,应该效率会高点,而且代码量也不是很大。
估计QGraphicsView可以,而且连事件响应都不用模拟了,只需要写更新按钮图片的代码
离线newdc

只看该作者 6楼 发表于: 2008-09-24
引用第5楼破烂石头于2008-09-24 21:46发表的  :
如果只需要响应一些简单的鼠标/键盘事件的话,不需要弄一个控件数组
用一个合适的控件,然后在上面贴图,判断鼠标点击的范围,用更新贴图的方式模拟按钮,应该效率会高点,而且代码量也不是很大。
估计QGraphicsView可以,而且连事件响应都不用模拟了,只需要写更新按钮图片的代码

这也是个办法。
离线傻猫
只看该作者 7楼 发表于: 2008-09-24
破烂石头 说的 在MFC中典型的实现方法 ^_^

QT按钮数组我实现过,小封装下就可以狠优雅的实现了

pegsell.h
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#ifndef PEGCELL_H
#define PEGCELL_H

#include <QWidget>
class QGridLayout;
class QToolButton;

class PegCell :public QWidget
{
    Q_OBJECT
public:
    PegCell(QWidget *parent=0);
    void setXY(int x,int y);
    void setState(int s);
    int getState();
signals:
    void clicked(int x,int y);
public slots:
    void onClicked();
    void stateChanged();
private:
    int posx,posy,state;
    QToolButton *peg;
    QGridLayout *lay;
};
#endif

pegsell.cpp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <QtGui>

#include "pegcell.h"

PegCell::PegCell(QWidget *parent):QWidget(parent)
{
    peg=new QToolButton;
    lay=new QGridLayout;
    state=1;
    stateChanged();
    lay->addWidget(peg);
    setLayout(lay);
    connect(peg, SIGNAL(clicked()), this, SLOT(onClicked()));
}
void PegCell::setXY(int x,int y)
{
    posx=x;
    posy=y;
}
void PegCell::setState(int s)
{
    state=s;
    stateChanged();
}
int PegCell::getState()
{
    return state;
}
void PegCell::stateChanged()
{
    QSize iconSize(40, 40);
    if(state==1)
    {
        peg->setIcon(QIcon(QPixmap(":/images/purple_down.png")
                        .scaled(34, 34)));
        peg->setIconSize(iconSize);
    }
    else if(state==2)
    {
        peg->setIcon(QIcon(QPixmap(":/images/orange_up.png")
                        .scaled(34, 34)));
        peg->setIconSize(iconSize);
    }
    else
    {
        peg->setIcon(QIcon(QPixmap(":/images/empty.png")
                        .scaled(34, 34)));
        peg->setIconSize(iconSize);
    }
}
void PegCell::onClicked()
{
    emit clicked(posx,posy);
}

创建
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      for(i=0;i<n;++i)
    {
        for (j=0;j<n;++j)
        {
            pegCell[j].setXY(i,j);
            connect(&pegCell[j],SIGNAL(clicked(int,int)),
                    this,SLOT(onClicked(int,int)));
            if(i<height||i>=width+height)
                if(j<height||j>=width+height)
                    continue;
            gridLayout->addWidget(&pegCell[j],i+1,j+1);
        }
    }

使用
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void PegField::onClicked(int x,int y)
{
    if(!playing)
    {
        if(pegCell[x][y].getState()==0)
            pegCell[x][y].setState(1);
        else
            pegCell[x][y].setState(0);
    }
    else
    {
        if(fromx==-1)
        {
            switch(pegCell[x][y].getState())
            {
            case 0:return;
            case 2:{
                pegCell[x][y].setState(1);
                fromx=-1;
                break;
                   }
            case 1:
                pegCell[x][y].setState(2);
                fromx=x;
                fromy=y;
            }
        }
        else
        {
            if(pegCell[x][y].getState()==2)
            {
                pegCell[x][y].setState(1);
                fromx=-1;
            }
            else if(pegCell[x][y].getState()==1)
            {
                pegCell[fromx][fromy].setState(1);
                fromx=x;
                fromy=y;
                pegCell[x][y].setState(2);
            }
            else
            {
                if(x!=fromx&&y!=fromy)
                {
                    pegCell[fromx][fromy].setState(1);
                    fromx=-1;
                    return ;
                }
                if(x-fromx==2||fromx-x==2||y-fromy==2||fromy-y==2)
                {
                    if(pegCell[(fromx+x)/2][(fromy+y)/2].getState()==1)
                    {
                        pegCell[(fromx+x)/2][(fromy+y)/2].setState(0);
                        pegCell[fromx][fromy].setState(0);
                        pegCell[x][y].setState(1);
                        judge();
                    }
                    else
                        pegCell[fromx][fromy].setState(1);
                    fromx=-1;
                }
                else
                {
                    pegCell[fromx][fromy].setState(1);
                    fromx=-1;
                }
            }
        }
    }
}
-------------------------------
不常在
有事短消息或者到我blog讨论http://hi.baidu.com/ning_cat
已经没用qt作开发了。。。:-(
离线破烂石头
只看该作者 8楼 发表于: 2008-09-25
所谓的控件数组完全是vb弄出来的一个概念,最后自己也抛弃了这个东西,在vb.net里面主没有了
在支持指针的语言里面,什么都可以做成数组的形式。自己new一组QPushButton,分别设置属性,显示出来就完了。
但是用控件数组有一个潜在的问题,比如扫雷,有一百个按钮,如果每个都做成一个控件,那么会占用相当多的资源,情况再极限一些,也许有几千上万个按钮,也许系统根本就不支持创建这么多的的窗体。

傻猫 
我不会MFC,这个是我们上VB课的时候老师当场演示的一个扫雷的demo,当时什么都不懂,所以印象很深刻。
离线傻猫
只看该作者 9楼 发表于: 2008-09-25
呵呵,现在在做MFC的东西,控件都是自绘,PtInRect用到我吐血。。。

上面是我上学期课程设计里面用到的。

xp系统好象可以支持上千个控件的,何况你屏幕画不了那么多
-------------------------------
不常在
有事短消息或者到我blog讨论http://hi.baidu.com/ning_cat
已经没用qt作开发了。。。:-(
离线mumutouv

只看该作者 10楼 发表于: 2008-09-25
用QList<QPushButton*> button_list;
在新建一个pushbutton之后,添加进来

example:
QPushButton *p = new QPushButton(parent);
button_list.push_back(p);
快速回复
限100 字节
 
上一个 下一个