qt怎么在qframe内动态创建按钮

qt怎么在qframe内动态创建按钮,第1张

动态对话框是在程序运行时用 Qt Designer 的.ui 文件创建。不用 uic工具把.ui 文件变成

等价的 c++代码,而是在程序时使用类 QUiLoader 加载.ui文件,例如下面的代码:

QUiLoader uiLoader

QFile file("sortdialog.ui")

QWidget *sortDialog = uiLoader.load(&file)

if (sortDialog) {

...

}

子控件可以用 QObject::findChild<T>()得到

QComboBox *primaryColumnCombo =

sortDialog->findChild<QComboBox *>("primaryColumnCombo")

if (primaryColumnCombo) { ...

}

findChild<T>()是模板成员函数,得到类型为 T 的给定名字的子控件的指针。由于编

译器的原因,用 MSVC6 是得不到的。如果使用的是 MSVC6,那么可以使用全局函数

qFindChild<T>()。

QUiLoader 类在一个单独的链接库中,如果在一个应用程序中使用了 QUiLoader,

必须在这个程序的.pro文件中添加下面这样的代码:

CONFIG += uitools

使用动态对话框不用重新编译程序就能够改变对话框的布局

最近看到很多项目界面设计的很有个性,突破qt的原先风格。

才知道button和label可以自由设计形状。

举例:如何改变qt的button规则呢

Qt中有两种方法来实现不规则形状的窗口

可以设置QWidget的窗口属性Qt::WA_TranslucentBackground为true来实现。但是利用这个属性有很大的限制。在window平台下,你必须设置Qt::FramelessWindowHint属性为true,设置窗口为一个没有标题栏的窗口。在X11平台下,你还要依靠 a compositing window manager.局限很多 。

利用setMask()函数来实现, void QWidget::setMask ( const QRegion &region ) 可以使得仅和region重叠的区域可见。但是,如果这个区域包括widget的rect()以外的像素,窗口控制的这个区域可见不可见,将取决于具体的平台。 所以,如果获得这个不规则的区域,然后在resizeEvent函数中调用这个函数,就可以获得一个不规则的形状的窗口。

qt的帮助文档上写到:

QPixmap pixmapLeft(":/MainWindow/Resources/Images/TestLeft.png")

ui.btnLeft->setMask(pixmapLeft.mask())

QPixmap pixmapRight(":/MainWindow/Resources/Images/TestRight.png")

ui.btnRight->setMask(pixmapRight.mask())

QLabel topLevelLabel

QPixmap pixmap(":/images/tux.png")

topLevelLabel.setPixmap(pixmap)

topLevelLabel.setMask(pixmap.mask())

先通过pix的方法获得图片的过滤掉透明的部分得到的图片,作为button和label的不规则边框。

所以只需要在ps里画一个含有透明部分的图片,保存成png格式,然后用它来setMask你的按钮和文本标签。

最后软件运行后,按钮效果,只有不透明的地方,才有点击效果。透明的地方看不到按钮。

// ----- 答案肯定是可以的 -----//

// 先创建原先的界面,用布局进行管理

QWidget *widgetMain = new QWidget()

// 加入一个输入框和按钮

QLineEdit *lineEdit = new QLineEdit(widgetMain)

QPushButton *btn = new QPushButton(widgetMain)

// 用水平布局将这2个控件框起,并且置于界面顶部

QHBoxLayout *horLayout = new QHBoxLayout()

horLayout->addWidget(lineEdit, 4)

horLayout->addWidget(btn, 1)        // 设置布局比例为4:1

// 然后添加一个全局布局控件

QVBoxLayout *verLayout = new QVBoxLayout(widgetMain)

verLayout->addLayout(horLayout)// 加入刚才的输入组,底部添加d簧

verLayout->addStretch()

// --------- 基本界面创建完成 -------------- //

// 关联处理动态创建

int nCnt = lineEdit->text().toInt() // 输入的个数

for (int i = 0 i < nCnt i++) {

    QLabel *label = new QLabel(widgetMain)

    // 插入之前的布局

    label->setText(QString("动态创建label %1).arg(i + 1))

    verLayout->insertWidget(1 + i, label)

}

// 大功告成

// 备注,以上代码纯手工,写法或其他错误请自行修改,仅作参考


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/8025479.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存