上周为了用Qt写一个类似颜色下拉框的东西,查阅了网上的多数相关资料,依然没有我想要的。终于在周四的时候下定决心重写QCombobox类来实现功能,现在把它贴出来,望看到的人,批评指正。废话不多说,先上图:
图片1-1
点击下拉之后,出现的是下拉表格,里面都是button,我用了最简单的setstylesheet直接设置背景,点击颜色按钮之后,我展示的效果是在编辑框位置有颜色label。因为没有创建这些按钮的索引,所以我是直接简单粗暴的用的按钮的cliced()信号,颜色的话我是重写了QPushButton类,发送的是clicked(QString),将颜色直接传过去的。other按钮是可以弹出QColorDialog,Qt自带的就不多说了。效果如图:
图片1-2
图片1-3
关键代码如下:
1 MyCombobox::MyCombobox(QWidget *parent) : QComboBox(parent) 2 { 3 QTableWidget * tableWidget = new QTableWidget(3, 8); 4 tableWidget->verticalHeader()->setVisible(false); 5 tableWidget->horizontalHeader()->setVisible(false); 6 tableWidget->setShowGrid(false); 7 tableWidget->setSpan(2,0,1,8); 8 int k = 0; 9 for (int i = 0; i < 3; ++i)10 {11 if(i==0||i==1){12 for (int j = 0; j < 8; ++j)13 {14 tableWidget->setColumnWidth(j, 32);15 tableWidget->setRowHeight(j, 24);16 QStringList colorList = QColor::colorNames();\17 MyPushButton * itemWidget = new MyPushButton(colorList[k],this);18 itemWidget->setStyleSheet("QPushButton { ">";}");19 k++;20 tableWidget->setCellWidget(i, j, itemWidget);21 connect(itemWidget,SIGNAL(clicked(QString)),this,SLOT(change(QString)));22 }23 }else{24 other =new QPushButton(this);25 other->setText("other");26 tableWidget->setCellWidget(2, 0, other);27 }28 }29 connect(other,SIGNAL(clicked()),this,SLOT(otherColor()));30 this->setModel(tableWidget->model());31 this->setView(tableWidget);32 }33 void MyCombobox::change(QString colorname)34 {35 QLabel *showColor = new QLabel(this);36 showColor->setStyleSheet("QLabel { ">";}");37 showColor->setGeometry(5,5,240,20);38 showColor->setVisible(true);39 }40 void MyCombobox::otherColor()41 {42 QColor mycolor = QColorDialog::getColor(Qt::white, this);43 this->change(mycolor.name());44 }
刚接触Qt,写的不好,如果各位有好的想法,我们可以多多沟通,比心