【Qt】Qt之非QListWidget的QWidget窗体部分滚动---QScrollArea滚动区

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Strong_HCyouth/article/details/86712080

实现效果:(确认按钮固定,上方内容右侧有滚动条可上下滑动)

1因为初学小白异想天开,想通过QVboxLayout在上面做一个固定QWidget,限制其高度,让他达到滚动的目的,做成了下面这个模样

2通过网上查找方法知道了滚动区QScrollArea可以实现区域内容滚动效果

/*添加窗体内部滚动布局*/
void addTrunk()
{
	scrollArea = new QScrollArea(this);
	scrollArea->setGeometry(0, 50, 360, 450);/*左上长宽*/

	QFrame * widget = new QFrame(this);
	widget->setContentsMargins(0, 0, 0, 0);
	widget->setFixedSize(350, 590);
	m_pTrunk = new QVBoxLayout(widget);
	m_pTrunk->setContentsMargins(15, 0, 20, 10);
	m_pTrunk->setSpacing(10);

	QLabel *roomName = new QLabel;
	roomName->setText(u8"房间名:");
	roomName->setObjectName("editroom_topic");
	QTextEdit *roomNameEdit = new QTextEdit;
	roomNameEdit->setFixedWidth(331);
	roomNameEdit->setFixedHeight(54);
	roomNameEdit->setPlaceholderText(QStringLiteral("请输入房间名"));
	roomNameEdit->setObjectName("grey_4r_textedit");

	QLabel *roomNoticeTitle = new QLabel;
	roomNoticeTitle->setText(u8"公告标题(限10个字):");
	roomNoticeTitle->setObjectName("editroom_topic");
	m_pNoticeTitleRegister = new QLabel();  //计数器
	m_pNoticeTitleRegister->setGeometry(100, 250, 58, 18);
	m_pNoticeTitleRegister->setStyleSheet("QLabel{color:#95949D;font:14px;}");
	roomNoticeTitleEdit = new QLineEdit;
	roomNoticeTitleEdit->setFixedWidth(250);
	roomNoticeTitleEdit->setFixedHeight(30);
	roomNoticeTitleEdit->setPlaceholderText(QStringLiteral("请输入公告标题"));
	roomNoticeTitleEdit->setObjectName("grey_4r_lineedit_register");
	roomNoticeTitleEdit->setMaxLength(10);
	connect(roomNoticeTitleEdit, SIGNAL(textEdited()), this, SLOT(slot_scalerNoticeTitleText()));

	QLabel *roomNotice = new QLabel;
	roomNotice->setText(u8"房间公告(限300个字):");
	roomNotice->setObjectName("editroom_topic");
	m_pNoticeRegister = new QLabel();  //计数器
	m_pNoticeRegister->setGeometry(100, 450, 58, 18);
	m_pNoticeRegister->setStyleSheet("QLabel{color:#95949D;font:14px;}");
	roomNoticeEdit = new QTextEdit;
	roomNoticeEdit->setFixedWidth(314);
	roomNoticeEdit->setFixedHeight(110);
	roomNoticeEdit->setPlaceholderText(QStringLiteral("请输入房间公告..."));
	roomNoticeEdit->setObjectName("grey_4r_textedit_Register");
	roomNoticeEdit->setMaximumWidth(10);
	connect(roomNoticeEdit, SIGNAL(textChanged()), this, SLOT(slot_scalerNoticeText()));

	QLabel *roomWelcome = new QLabel;
	roomWelcome->setText(u8"欢迎语(限300个字):");
	roomWelcome->setObjectName("editroom_topic");
	m_pWelcomeRegister = new QLabel();  //计数器
	m_pWelcomeRegister->setGeometry(100, 650, 58, 18);
	m_pWelcomeRegister->setStyleSheet("QLabel{color:#95949D;font:14px;}");
	roomWelcomeEdit = new QTextEdit;
	roomWelcomeEdit->setFixedWidth(314);
	roomWelcomeEdit->setFixedHeight(110);
	roomWelcomeEdit->setPlaceholderText(QStringLiteral("请输入欢迎语..."));
	//roomWelcomeEdit->setHtml(QString("<font color=\"#95949D\">%1</font>").arg(QStringLiteral("  请输入欢迎语...")));
	roomWelcomeEdit->setObjectName("grey_4r_textedit_Register");
	connect(roomWelcomeEdit, SIGNAL(textChanged()), this, SLOT(slot_scalerWelcomeText()));

	QLabel *roomKey = new QLabel;
	roomKey->setText(u8"房间密码:");
	roomKey->setObjectName("editroom_topic");
	QLineEdit *roomKeyEdit = new QLineEdit;
	roomKeyEdit->setFixedWidth(331);
	roomKeyEdit->setFixedHeight(30);
	roomKeyEdit->setPlaceholderText(QStringLiteral("请输入4位房间密码..."));
	roomKeyEdit->setObjectName("grey_4r_lineedit");
	QRegExp regx("[0-9]+$");
	QValidator *validator = new QRegExpValidator(regx, roomKeyEdit);
	roomKeyEdit->setValidator(validator);
	roomKeyEdit->setMaxLength(4);

	/*结合计数器和edit*/
	QWidget *m_pNoticeTitleBar = new QWidget;
	m_pNoticeTitleBar->setContentsMargins(0, 0, 0, 0);
	m_pNoticeTitleBar->setFixedWidth(330);
	m_pNoticeTitleBar->setFixedHeight(30);
	m_pNoticeTitleBar->setObjectName("edit_Register_bar");
	QVBoxLayout *m_pNoticeTitleBox = new QVBoxLayout(m_pNoticeTitleBar);
	m_pNoticeTitleBox->addWidget(roomNoticeTitleEdit, 0, Qt::AlignLeft);

	QWidget *m_pNoticeBar = new QWidget;
	m_pNoticeBar->setFixedHeight(120);
	m_pNoticeBar->setFixedWidth(330);
	m_pNoticeBar->setObjectName("edit_Register_bar");
	QVBoxLayout *m_pNoticeBox = new QVBoxLayout(m_pNoticeBar);
	m_pNoticeBox->addWidget(roomNoticeEdit, 0, Qt::AlignTop | Qt::AlignLeft);
	m_pNoticeBox->addWidget(m_pNoticeRegister, 0, Qt::AlignTrailing | Qt::AlignRight);
	m_pNoticeBox->addSpacing(2);

	QWidget *m_pWelcomeBar = new QWidget;
	m_pWelcomeBar->setFixedHeight(120);
	m_pWelcomeBar->setFixedWidth(330);
	m_pWelcomeBar->setObjectName("edit_Register_bar");
	QVBoxLayout *m_pNoticeWelcomeBox = new QVBoxLayout(m_pWelcomeBar);
	m_pNoticeWelcomeBox->addSpacing(-6);
	m_pNoticeWelcomeBox->addWidget(roomWelcomeEdit, 0, Qt::AlignTop | Qt::AlignLeft);
	m_pNoticeWelcomeBox->addWidget(m_pWelcomeRegister, 0, Qt::AlignTrailing | Qt::AlignRight);
	m_pNoticeWelcomeBox->addSpacing(2);

	m_pTrunk->addWidget(roomName, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(roomNameEdit, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(roomNoticeTitle, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(m_pNoticeTitleBar, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(roomNotice, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(m_pNoticeBar, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(roomWelcome, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(m_pWelcomeBar, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(roomKey, 0, Qt::AlignLeft);
	m_pTrunk->addWidget(roomKeyEdit, 0, Qt::AlignLeft);
	widget->setLayout(m_pTrunk);
	scrollArea->setWidget(widget);
	widget->setObjectName("we");
	widget->setStyleSheet("QFrame#we{background:white;}");
}

*QFrame与QWidget的区别:

QFrame是基本控件的基类,QWidget是QFrame基类,关系如下:

QPushButton,QLabel… -> QFrame ->QWidget

*QScrollArea布局是出现滚动条的原因,主要是因为其中包含了一个子类scrllAreaWidgetContents,是小widget套一个大widget实现内部装不下而出现滚动效果。

步骤如下:

1)new QScrollArea;

2)new QFrame;

3)new QLabel,QPushButton等内部布局控件;

4)将内部控件装入内部布局QFrame;

5)将QFrame内部布局装入QScrollArea

3.无法改变滚动区背景颜色

QScrollArea 是无法通过样式表来改变背景色的,只能设置加入到QScrollArea里面的QWidget的样式,这样才能改变背景色。

当然也可以通过函数来设置QScollArea的背景色。

scrollArea->setBackgroundRole(QPalette::Dark);  // 背景色

参照其他博主原文:https://blog.csdn.net/woniulx2014/article/details/83176220 

https://blog.csdn.net/panghaichun/article/details/50781681

4.setVerticalScrollMode(QAbstractItemView::ScrollMode::ScrollPerPixel);

5.QListWidgetItem按照像素滚动到底部

猜你喜欢

转载自blog.csdn.net/Strong_HCyouth/article/details/86712080