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

Qt 界面图标显示,并显示文字注释

2013-01-16 11:40 447 查看
最近做基于QT 的界面,实现主界面调用各个应用程序,最初是在主界面添加按钮QPushButtoon,每个应用程序对应一个按钮,点击按钮调用相应的应用程序,这是最笨的一种方法,这种方法比较死板,不易于动态扩展,当添加新的应用程序的时候就需要修改主界面的代码,后来发现一种动态添加按钮的方法,并且在按上面添加图片,代码如下:

void MainWindow::createButtons()

{

QPushButton *programBtn;

QLabel *labelword;

programDir = QDir(PROGRAMPATH);

QStringList files;

int rownum,cloumnum;

files = programDir.entryList(QStringList("*"),

QDir::Files | QDir::NoSymLinks|QDir::Executable);

for (int i = 0; i < files.size(); ++i) {

rownum=i/4;

cloumnum=i%4;

// QFile file(programDir.absoluteFilePath(files[i]));

// programBtn=new QPushButton(files[i],this);

programBtn=new QPushButton(tr(""),this);

// labelword=new QLabel(files[i],this);

//labelword->setBuddy(programBtn);

connect(programBtn,SIGNAL(clicked()),this,SLOT(btnClicked()));

// connect(labelword,SIGNAL(clicked()),this,SLOT(textClicked()));

programBtn->setFixedHeight(80);

programBtn->setFixedWidth(80);

programBtn->setAccessibleDescription(files[i]);

programBtn->setAccessibleName(files[i]);

// programBtn->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);

// programBtn->setAccessibleDescription(sID);

// programBtn->setCheckable(true);

// programBtn->setAutoExclusive(true);

programBtn->setStyleSheet("border-image: url(./images/"+files[i]+".png)"); //括号内为图片的相对目录

programBtn->setIconSize(QSize(150,150)); //设置图片大小

mainLayout->addWidget(programBtn,rownum,cloumnum);

//mainLayout->addWidget(labelword,2*rownum+1,cloumnum);

programBtn->show();

//labelword->show();

}

}

这样做出来的界面需要做界面背景才好看,并且,程序扩展满主界面的所在的页面图片就没办法再显示上去,这种图片下面也不容易加文字注释,最后改成listwidget控件,我首先看到QT4.8库安装的时候例程里有个configdialog工程,里面代码如下

ConfigDialog::ConfigDialog()

{

contentsWidget = new QListWidget;

contentsWidget->setViewMode(QListView::IconMode);

contentsWidget->setIconSize(QSize(96, 84));

contentsWidget->setMovement(QListView::Static);

contentsWidget->setMaximumWidth(128);

contentsWidget->setSpacing(12);

pagesWidget = new QStackedWidget;

pagesWidget->addWidget(new ConfigurationPage);

pagesWidget->addWidget(new UpdatePage);

pagesWidget->addWidget(new QueryPage);

QPushButton *closeButton = new QPushButton(tr("Close"));

createIcons();

contentsWidget->setCurrentRow(0);

connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));

QHBoxLayout *horizontalLayout = new QHBoxLayout;

horizontalLayout->addWidget(contentsWidget);

horizontalLayout->addWidget(pagesWidget, 1);

QHBoxLayout *buttonsLayout = new QHBoxLayout;

buttonsLayout->addStretch(1);

buttonsLayout->addWidget(closeButton);

QVBoxLayout *mainLayout = new QVBoxLayout;

mainLayout->addLayout(horizontalLayout);

mainLayout->addStretch(1);

mainLayout->addSpacing(12);

mainLayout->addLayout(buttonsLayout);

setLayout(mainLayout);

setWindowTitle(tr("Config Dialog"));

}

代码实现的界面效果如下

我最初照着程序搬上去实现不了我要的效果,我想实现图片一排排的放,每行放三四个,我比较笨,于是一个个函数试验,修改参数,最后把setMaximumWidth(128);的参数中的128修改成我的界面的宽度才满足了我的需要。实现了图片一行行的摆放,

按钮添加就是按照这个方法,代码如下

void ConfigDialog::createIcons()

{

QListWidgetItem *configButton = new QListWidgetItem(contentsWidget);

configButton->setIcon(QIcon(":/images/config.png"));

configButton->setText(tr("Configuration"));

configButton->setTextAlignment(Qt::AlignHCenter);

configButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);

QListWidgetItem *updateButton = new QListWidgetItem(contentsWidget);

updateButton->setIcon(QIcon(":/images/update.png"));

updateButton->setText(tr("Update"));

updateButton->setTextAlignment(Qt::AlignHCenter);

updateButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);

QListWidgetItem *queryButton = new QListWidgetItem(contentsWidget);

queryButton->setIcon(QIcon(":/images/query.png"));

queryButton->setText(tr("Query"));

queryButton->setTextAlignment(Qt::AlignHCenter);

queryButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);

connect(contentsWidget,

SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),

this, SLOT(changePage(QListWidgetItem*,QListWidgetItem*)));

}

我把程序编译完下到板子上同一个程序不能被连续调用,每次只能调用一次,下次换调用别的程序才行,试了好大大会才知道是因为信号采用了currentItemChanged(QListWidgetItem*,QListWidgetItem*)),的原因,我改成clicked(QListWidgetItem*,QListWidgetItem*),程序在Pc机上运行还可以,但是下到板子上就反映很迟钝,后来一个个函数试验,换成

connect(contentsWidget,SIGNAL(itemEntered(QListWidgetItem*)),this,SLOT(ItemClicked(QListWidgetItem*)));

下到板子上可以很灵敏,效果很好,希望能对大家有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: